使用Mockito或jUnit验证方法中的调用

时间:2013-04-10 19:02:27

标签: java spring junit mockito

我正在对DAO进行一些修改。修改包括重构一些代码以防止一些方法多次调用.getResultsList()。相反,结果缓存到List,所有后续代码都与该列表一起使用,只需一次访问数据库就可以更有效地运行代码。

我被要求为我修改的方法创建jUnit测试,以确保将来不会再发生这样的事情。我有可能验证方法中的局部变量有多少次使用mockito调用它的函数?

我在使用verify验证在模拟对象上进行的调用次数时,已经看到了几个问题/论坛帖子。但实际上我没有访问模拟这个对象,因为它是在方法中创建的,而不是传入的。

基本上 -

myDao有一个名为EntityManager的类变量emem.createNamedQuery()函数存储在TypedQuery变量q中。这个q是多次调用.getResultsList的。

在我的jUnit测试中,是否可以听到我正在调用我的模拟Dao的方法中发生的事情,并确保q.getResultsList仅在方法运行时被调用一次?

更新

我的测试类中的

myDao使用@Autowired注释进行配置,如下所示:

@Autowired
MyDao myDao;

它在applicationContext.xml中定义如下:

<bean id="myDao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.mypackage.myDao"/>
</bean>

我正在调用的方法是在DAO中,所以我调用myDao.myMethod(myVar);内部myMethod是我想要听的q变量。这是一个局部变量。

1 个答案:

答案 0 :(得分:2)

如果你在嘲笑myDao,那么你将无法在myDao中验证代码。

要测试这个,你需要测试myDao类。在该单元测试中,您可以模拟EntityManager并让createNamedQuery返回模拟查询。然后,您可以使用mockito的verifytimes(1)来验证getResultsList()仅在模拟查询中调用过一次。