Mockito: ввод реальных объектов в закрытые поля @Autowired

Я использую аннотации Mockito @Mock и @InjectMocks для ввода зависимостей в частные поля, которые аннотируются с помощью Spring @Autowired:

@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Mock
    private SomeService service;

    @InjectMocks
    private Demo demo;

    /* ... */
}

и

public class Demo {

    @Autowired
    private SomeService service;

    /* ... */
}

Теперь я хотел бы также добавить объекты real в частные @Autowired поля (без сеттеров). Возможно ли это или механизм ограничен только для инъекций Mocks?

Ответ 1

Использовать аннотацию @Spy

@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
    @Spy
    private SomeService service = new RealServiceImpl();

    @InjectMocks
    private Demo demo;

    /* ... */
}

Mockito рассмотрит все поля с аннотацией @Mock или @Spy в качестве потенциальных кандидатов, которые будут введены в экземпляр, аннотированный аннотацией @InjectMocks. В приведенном выше примере экземпляр RealServiceImpl будет введен в демоверсию

Подробнее см.

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html

Ответ 2

В дополнение к ответу @Dev Blanked, если вы хотите использовать существующий bean, который был создан Spring, код может быть изменен на:

@RunWith(MockitoJUnitRunner.class)
public class DemoTest {

    @Inject
    private ApplicationContext ctx;

    @Spy
    private SomeService service;

    @InjectMocks
    private Demo demo;

    @Before
    public void setUp(){
        service = ctx.getBean(SomeService.class);
    }

    /* ... */
}

Таким образом, вам не нужно менять свой код (добавить другой конструктор), чтобы заставить тесты работать.