Взаимодействие Spock Integration Test не засчитано

Я хочу написать интеграционный тест для своего пользовательского класса Grails.

У меня есть метод afterUpdate(), который вызывает метод afterUpdate в userService, который вызывает другую службу.

Теперь я хочу убедиться, что вызов другой службы выполнен правильно. Если я отлаживаю код, метод вызывается правильно. но мой тест всегда терпит неудачу и говорит, что метод не вызывается:

    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

Обновление:

метод after Update действительно прост:

def afterUpdate(User user) {
    deleteETagCache(user)
}

def deleteETagCache(User user) {
    redisService.del(user.id.toString())
}

person Alexander Kiefer    schedule 10.01.2014    source источник
comment
не могли бы вы интегрировать вопрос с кодом afterUpdate?   -  person lucke84    schedule 10.01.2014
comment
Невозможно проверить взаимодействие без использования Mock() или Spy().   -  person topr    schedule 10.01.2014


Ответы (1)


Я думаю, вы путаете методы переопределения с магией метакласса и издеваетесь над классом или объектом. Я бы попробовал:

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

Кроме того, я бы создал модульный тест, а не интеграционный тест.

person Fran García    schedule 10.01.2014