我的一个类中有以下代码:
@PersistenceContext
protected EntityManager entityManager;
public entryPoint() {
for(Animal:getTheAnimals()) {
System.out.println(Animal.getName());
}
}
private List<Animal> getTheAnimals() {
return List<Animal>entityManager.createNamedQuery("myQuery").setParameter("myParam", new Date()).getResultList();
}
在我的测试课上,我有以下内容:
@Mock
private EntityManager entityManager;
@Mock
private Query query;
@Autowired
private ClassToTest classToTest;
@Test
public void someTest() {
List<Animal> list = new ArrayList<Animal>();
Mockito.when(entityManager.createNamdeQuery("myQuery")).thenReturn(query);
Mockito.when(query.setParameter(any(String.class), any(java.util.Date.class)).getResultList()).thenReturn(list);
...something more here...
}
正如您所看到的,预期的行为是返回空列表,并且打印零动物名称。然而,事实并非如此,数据库中的实际动物正在列表中返回。我错过了什么?我尝试了几种不同的方法,结果都是一样的。
感谢阅读。
在您的问题中,您直接在被测系统的字段上使用@Autowired
,这似乎指示Spring解决依赖关系。它很可能是根据您的实际(生产(配置来实现的。
相比之下,常见的Mockito注释是@InjectMocks
,它忽略Spring,使用尽可能多的@Mock
对象实例化对象。
相关SO问题:在测试期间注入@Autowired变量