我想为Grails用户类编写集成测试。
我有一个afterUpdate()
方法,它调用userService中的afterUpdate方法,该方法调用另一个服务。
现在我想验证对其他服务的调用是否正确完成。如果我调试代码,则正确调用该方法。但我的测试总是失败,并说没有调用该方法:
def "After Update for User"() {
given:
RedisService.metaClass.'static'.del = {String key -> true}
User user = new User()
user.save(flush: true)
when:
user.afterUpdate()
then:
1 * redisService.del(!null)
}
我尝试过不同的事情,比如
then:
1 * user.userService.afterUpdate(!null)
1 * userService.redisService.del(!null)
1 * redisService.del(!null)
但他们都失败了。
我总是得到:
| Failure: After Update for User(com.boxcryptor.server.RedisCacheIntegrationSpec)
| Too few invocations for:
1 * user.userService.afterUpdate(!null) (0 invocations)
Unmatched invocations (ordered by similarity):
None
Too few invocations for:
1 * redisService.del(!null) (0 invocations)
Unmatched invocations (ordered by similarity):
None
更新
更新后的方法非常简单:
def afterUpdate(User user) {
deleteETagCache(user)
}
def deleteETagCache(User user) {
redisService.del(user.id.toString())
}
答案 0 :(得分:2)
我认为你混淆了使用metaClass魔法和模拟类或对象的方法。我会尝试:
def "After Update for User"() {
given:
def redisService = Mock(RedisService)
and:
User user = new User()
user.save(flush: true)
and:
user.redisService = redisService
when:
user.afterUpdate()
then:
1 * redisService.del(user.id.toString())
}
另外,我会创建一个单元测试,而不是集成测试。