【发布时间】:2013-04-10 19:02:26
【问题描述】:
我正在对 DAO 进行一些修改。修改包括重构一些代码以防止几个方法多次调用.getResultsList()。相反,结果被缓存到 List 并且所有后续代码都使用该列表,从而使代码只需要访问数据库一次就可以更有效地运行。
我被要求为我修改的方法创建 jUnit 测试,以确保以后不会再发生类似的事情。我是否可以验证方法中的局部变量使用 mockito 调用了多少次函数?
我看到了几个关于使用verify 验证对模拟对象进行的调用次数的问题/论坛帖子。但我实际上无权模拟这个对象,因为它是在方法内部创建的,没有被传入。
基本上-
myDao 有一个名为em 的类变量EntityManager,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 变量。这是一个局部变量。
【问题讨论】:
-
您在模拟哪些对象以及您的测试涵盖哪些功能?你是模拟
EntityManager,还是使用真正的数据库? -
@axtavt 我更新了这个问题,详细说明了它现在的配置方式。我试图找出一种方法来构建测试,而不必更改所有以前编写的测试来创建新的模拟对象。现在所有其他测试都只是使用
myDao和asserts。