1

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

我被要求为我修改的方法创建 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);InsidemyMethod是我想听的 q 变量。这是一个局部变量。

4

1 回答 1

2

如果您在模拟 myDao,那么您将无法在 myDao 中验证代码。

要对此进行测试,您需要对 myDao 类进行测试。在该单元测试中,您可以模拟EntityManagercreateNamedQuery返回一个模拟查询。然后,您可以使用 mockitoverifytimes(1)验证getResultsList()仅在模拟查询中调用过一次。

于 2013-04-10T19:30:19.567 回答