Quelle est la différence entre la méthode Mockito.mock(Class<T> classToMock)
et la méthode @Mock
annotation? Sont-ils les mêmes?
Par exemple, est-ce:
private TestClass test = Mockito.mock(TestClass.class);
le même que:
@Mock
private TestClass test;
Ils obtiennent tous deux le même résultat. L'utilisation d'une annotation (@Mock
) Est généralement considérée comme "plus propre", car vous ne remplissez pas votre code avec des affectations standard qui se ressemblent toutes.
Notez que pour utiliser l'annotation @Mock
, Votre classe de test doit être annotée avec @RunWith(MockitoJUnitRunner.class)
ou contenir un appel à MockitoAnnotations.initMocks(this)
dans sa méthode @Before
.
La différence réside dans les lignes de code que vous devez écrire :) :) :)
Sérieusement, l'utilisation des annotations a exactement le même effet que l'utilisation de Mockito.mock.
Pour citer la documentation de MockitoAnnotations
l'utilisation d'annotations présente les avantages suivants:
Permet la création abrégée des objets requis pour les tests.
Minimise le code de création de maquette répétitive.
Rend la classe de test plus lisible.
Facilite la lecture de l'erreur de vérification car le nom du champ est
utilisé pour identifier la maquette.
Le javadoc pour MockitoAnnotations
est ici
Ils sont tous les deux considérés comme identiques et réalisent la même chose mais je préférerais le second:
@Mock est une annotation qui:
L'utilisation de l'annotation présente deux avantages importants.
@Mock
peut être injecté dans la classe que vous testez, en utilisant le @InjectMocks
annotation. Il s'agit d'une technique puissante qui peut faciliter considérablement les tests. Cela ne fonctionnera tout simplement pas avec les mocks créés par la méthode mock
.@Mock
, alors ce nom sera juste le nom du champ. Il est donc très facile de trouver le faux problème.Bien sûr, en plus de ces deux avantages importants, la plupart des gens trouvent le @Mock
la notation est beaucoup plus lisible et réduit la quantité de code. Je ne vois aucune raison de ne pas l'utiliser.
La réponse à la question est une grosse erreur. Nous venons de résoudre certains problèmes causés par Mockito.mock (Your.class) en tant que champ. Nous avions peu de méthodes @Test. La 4ème méthode lançait une exception avec 'thenThrow (ex)'. Toutes les méthodes @Test après son échec et la raison en est l'exception levée. Ils partageaient l'instance moquée et la condition "quand". Après avoir changé de
TestClass testInstance = Mockito.mock(TestClass.class);
à
@Mock
TestClass testInstance;
tout a commencé à fonctionner comme prévu. Donc, Mockito.mock crée une maquette partagée entre les méthodes de test, et @Mock ne le fait pas.