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);
}
/* ... */
}
Таким образом, вам не нужно менять свой код (добавить другой конструктор), чтобы заставить тесты работать.