我正在对DAO进行一些修改。修改包括重构一些代码以防止一些方法多次调用.getResultsList()
。相反,结果缓存到List
,所有后续代码都与该列表一起使用,只需一次访问数据库就可以更有效地运行代码。
我被要求为我修改的方法创建jUnit测试,以确保将来不会再发生这样的事情。我有可能验证方法中的局部变量有多少次使用mockito调用它的函数?
我在使用verify
验证在模拟对象上进行的调用次数时,已经看到了几个问题/论坛帖子。但实际上我没有访问模拟这个对象,因为它是在方法中创建的,而不是传入的。
基本上 -
myDao
有一个名为EntityManager
的类变量em
,em.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变量。这是一个局部变量。
答案 0 :(得分:2)
如果你在嘲笑myDao,那么你将无法在myDao中验证代码。
要测试这个,你需要测试myDao类。在该单元测试中,您可以模拟EntityManager
并让createNamedQuery
返回模拟查询。然后,您可以使用mockito的verify
和times(1)
来验证getResultsList()
仅在模拟查询中调用过一次。