Подтвердить что ты не робот

Несколько уровней @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.

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

4b9b3361

Ответ 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;