Несколько уровней @Mock и @InjectMocks
Итак, я понимаю, что в 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.
Возможно ли это с аннотациями?
Ответы
Ответ 1
Поскольку я не получил никакого ответа здесь, я спросил на форумах Mockito. Вот ссылка на обсуждение: https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion
Подводя итог ответам, технически это как бы поразило цель насмешки. Вы действительно должны только издеваться над объектами, необходимыми классу SystemUnderTest. Издевательские вещи в объектах, которые сами являются издевательствами, являются беспредметными.
Если вы действительно хотели это сделать, @spy может помочь
Ответ 2
Это можно объединить @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;
Ответ 3
Это работает для меня:
private MockObject1 mockObject1 = mock(MockObject1.class);
@Spy
private RealObject2 realObject = new RealObject2(mockObject1);
@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
Ответ 4
Другое найденное мной решение использует java sintax вместо аннотации, чтобы сделать объект @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;