web-dev-qa-db-fra.com

Quelle est la différence entre Mockito.mock (SomeClass) et l'annotation @Mock?

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;
51
Gábor Csikós

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 .

58
Mureinik

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

8
geoand

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:

  • Minimise le code de création de maquette répétitive.
  • Rend la classe de test plus lisible.
  • Permet la création abrégée des objets requis pour les tests.
4
Shweta

L'utilisation de l'annotation présente deux avantages importants.

  • Une maquette créée avec @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.
  • Si vous avez des erreurs concernant votre maquette, le nom de la maquette apparaîtra dans le message. Si vous avez utilisé @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.

4

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.

0
saferJo