【问题标题】:Validating calls within a method using Mockito or jUnit使用 Mockito 或 jUnit 验证方法中的调用
【发布时间】:2013-04-10 19:02:26
【问题描述】:

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

我被要求为我修改的方法创建 jUnit 测试,以确保以后不会再发生类似的事情。我是否可以验证方法中的局部变量使用 mockito 调用了多少次函数?

我看到了几个关于使用verify 验证对模拟对象进行的调用次数的问题/论坛帖子。但我实际上无权模拟这个对象,因为它是在方法内部创建的,没有被传入。

基本上-

myDao 有一个名为em 的类变量EntityManagerem.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 我更新了这个问题,详细说明了它现在的配置方式。我试图找出一种方法来构建测试,而不必更改所有以前编写的测试来创建新的模拟对象。现在所有其他测试都只是使用myDaoasserts

标签: java spring junit mockito


【解决方案1】:

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

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

【讨论】:

  • 我真的很害怕这就是答案,我希望其中一位 SO 大师会抛出一些神奇的方法来处理我的问题。
  • 或者只是verify。默认验证方式是times(1),所以你永远不需要写times(1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多