web-dev-qa-db-fra.com

Plusieurs niveaux de @Mock et @InjectMocks

Je comprends donc que dans Mockito @InjectMocks injectera tout ce qu'il peut avec l'annotation de @Mock, mais comment gérer ce scénario?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();

Imaginez que MockObject2 possède un attribut qui est de type MockObject1 et SystemUnderTest a un attribut de type MockObject2. Je voudrais que mockObject1 soit injecté dans mockObject2 et mockObject2 injecté dans systemUnderTest.

Est-ce possible avec des annotations?

37
Collin Peters

Comme je n'ai reçu aucune réponse ici, j'ai demandé sur les forums Mockito. Voici un lien vers la discussion: https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

Pour résumer les réponses, cela irait à l'encontre du but de la moquerie. Vous ne devriez vraiment vous moquer que des objets nécessaires à la classe SystemUnderTest. Se moquer des choses dans des objets qui sont eux-mêmes des moqueries est un peu inutile.

Si vous vouliez vraiment le faire, @spy peut vous aider

29
Collin Peters

C'est possible en combinant @Spy avec @InjectMocks. Pour votre exemple, ce serait:

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@Spy @InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = new MockObject2 ();

@InjectMocks
private SystemUnderTest systemUnderTest;
20
MattC

Une autre solution que j'ai trouvée utilise la syntaxe Java à la place de l'annotation pour injecter l'objet @Spy.

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = spy(MockObject2.class);

@InjectMocks
private SystemUnderTest systemUnderTest;
7
z1lV3r

Cela fonctionne pour moi:

private MockObject1 mockObject1 = mock(MockObject1.class);

@Spy
private RealObject2 realObject = new RealObject2(mockObject1);

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
2
Zane