Plusieurs niveaux de @Mock et @ InjectMocks
alors je comprends 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 ait un attribut qui est de type MockObject1, et SystemUnderTest a un attribut de type MockObject2. J'aimerais que mockObject1 soit injecté dans mockObject2, et mockObject2 injecté dans systemUnderTest.
Est-ce possible avec des annotations?
4 réponses
comme je n'ai pas eu de 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, techniquement cela irait à l'encontre du but de se moquer. Vous ne devriez vraiment vous moquer que des objets nécessaires à la classe SystemUnderTest. Se moquer de choses à l'intérieur d'objets qui sont eux-mêmes des moqueries est en quelque sorte inutile.
Si vous avez vraiment envie de faire c', @spy peut aider
c'est possible en combinant @Spy avec @InjectMocks. Pour votre exemple, il 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;
Cela fonctionne pour moi:
private MockObject1 mockObject1 = mock(MockObject1.class);
@Spy
private RealObject2 realObject = new RealObject2(mockObject1);
@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
une autre solution que j'ai trouvée utilise java sintax à la place annotation pour faire l'objet @Spy injecté.
@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;