模拟EntityManager(Mockito)

时间:2014-04-30 13:54:56

标签: unit-testing testing junit mocking mockito

我的一个班级中有以下代码:

@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...
}

正如您所看到的,预期的行为是返回空列表,并打印零动物名称。然而情况并非如此,并且db中的实际动物正在列表中返回。我错过了什么?我尝试了几种相同的结果。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

在您的问题中,您直接在被测系统的字段上使用@Autowired,这似乎指示Spring解决依赖关系。它可能是从您的实际(生产)配置中完成的。

相比之下,常见的Mockito注释是@InjectMocks,它忽略了Spring,使用尽可能多的@Mock个对象来实例化对象。

相关问题:Injecting into @Autowired variable during testing