如何使用 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]
}
使用 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]
}