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?

23
demandé sur Collin Peters 2011-06-10 03:27:16

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

21
répondu Collin Peters 2011-06-28 16:28:18

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;
11
répondu MattC 2016-08-15 16:49:29

Cela fonctionne pour moi:

private MockObject1 mockObject1 = mock(MockObject1.class);

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

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
3
répondu Zane 2016-03-25 11:48:38

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;
3
répondu z1lV3r 2017-08-02 21:22:53