Spock Integration Test交互不计算在内

时间:2014-01-10 10:39:22

标签: grails testing integration-testing spock

我想为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())
}

1 个答案:

答案 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())
}

另外,我会创建一个单元测试,而不是集成测试。