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?
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
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;
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;
Cela fonctionne pour moi:
private MockObject1 mockObject1 = mock(MockObject1.class);
@Spy
private RealObject2 realObject = new RealObject2(mockObject1);
@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();