Несколько уровней @Mock и @InjectMocks - PullRequest
29 голосов
/ 10 июня 2011

Итак, я понимаю, что в Mockito @InjectMocks будет вводить все, что может, с аннотацией @Mock, но как справиться с этим сценарием?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();

Представьте, что MockObject2 имеет атрибут, который имеет типMockObject1, а SystemUnderTest имеет атрибут типа MockObject2.Я хотел бы, чтобы mockObject1 вводили в mockObject2, а mockObject2 вводили в systemUnderTest.

Возможно ли это с аннотациями?

Ответы [ 4 ]

24 голосов
/ 28 июня 2011

Так как я не получил никакого ответа здесь, я спросил на форумах Mockito. Вот ссылка на обсуждение: https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

Подводя итог, можно сказать, что технически это было бы своего рода победой над целью насмешки. На самом деле вы должны только издеваться над объектами, необходимыми для класса SystemUnderTest. Насмешка над объектами, которые сами по себе являются насмешками, бессмысленна.

Если вы действительно хотели это сделать, @spy может помочь

17 голосов
/ 15 августа 2016

Это возможно, комбинируя @Spy с @InjectMocks.Для вашего примера это будет:

@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;
4 голосов
/ 03 августа 2017

Другое решение, которое я нашел, - это использование синтаксиса Java вместо аннотации для внедрения объекта @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;
3 голосов
/ 25 марта 2016

Это работает для меня:

private MockObject1 mockObject1 = mock(MockObject1.class);

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

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...