如何使用 Spock 模拟 EntityManager 和 Query?

How to mock EntityManager and Query with Spock?

使用 spock 我需要模拟对 EntityManager/Query 的调用。我试图模拟的代码行是:

entityManager.createNativeQuery("nativeQuery").setParameter(1, param1).getResultList()

entityManager.createNativeQuery return 的 mock 是一个空 Query 对象。然后会导致失败,因为您不能在空对象上调用方法。因此,我无法模拟结果集列表的 return。

我已经尝试将语句分解为单独的语句和随附的模拟,但这也没有用,因为我仍然得到一个空查询。

我不知道我现在是否对此有所了解,或者这是否不能被嘲笑 - 至少对于 Spock。

感谢所有帮助!

您需要做的是构建一个相互返回的模拟层次结构,从最后一个开始:

查询:

def query = Mock(Query) {
   setParameter(_, _) >> it //here as mock itself is returned
   getResultList() >> []    //empty list
}

实体管理器:

def manager = Mock(EntityManager) {
   createNativeQuery(_) >> query
}

等等。虽然你需要实现的是可行的,但它或多或少表明设计不好:每次模拟 returns 模拟仙女死亡 ,所以你应该避免这样的构造。您可以做的是将查询构建与其执行分开 - 然后模拟会容易得多。示例规格:

def 'fairy has just died'() {
   given:
   def query = Mock(Query) {
      setParameter(_, _) >> it //here as mock itself is returned
      getResultList() >> [1]    //empty list
   }

   def manager = Mock(EntityManager) {
      createNativeQuery(_) >> query
   }

   expect:
   manager.createNativeQuery("").setParameter(1,1).getResultList() == [1]
}