Mocked метод возвращает ноль при проверке вызовов - PullRequest
1 голос
/ 30 апреля 2019

Я не уверен, что неправильно использую тестирование, основанное на взаимодействии, или я делаю что-то неправильно.Я работаю над Spring Boot Application (Kotlin), и мои тесты используют Spock / Groovy.

У меня есть тестируемый класс, который вызывает другой сервис для запроса информации.Тестируемый класс должен кешировать результаты.Однако я не могу смоделировать метод с возвращаемым значением И проверить количество вызовов, потому что смоделированный метод всегда возвращает ноль, как только я добавляю проверку на вызов.

Я создал изолированный пример, который демонстрирует проблему.

Это тестируемый класс:

@Service
class DemoService(private val downstreamService: DownstreamService) {
    fun demo(id: String): String {
        val something = downstreamService.something(id)
        return something
    }
}

, который использует этот сервис:

@Service
class DownstreamService {
    fun something(id: String): String {
        return id
    }
}

и вот так выглядят мои тесты:

class DemoServiceTest extends Specification {
    def downStream = Mock(DownstreamService)
    def demoService = new DemoService(downStream)

    def "value check"() {
        given:
        def test = "my test string"
        downStream.something(test) >> "xxx"

        when:
        def actual = demoService.demo(test)

        then:
        actual == "xxx" // works
    }   

    def "invocation check"() {
        given:
        def test = "my test string"
        downStream.something(test) >> "xxx"

        when:
        demoService.demo(test)

        then:
        1 * downStream.something(test) // works
    }

    def "combined check"() {
        given:
        def test = "my test string"
        downStream.something(test) >> "xxx"

        when:
        def demo = demoService.demo(test)

        then:
        1 * downStream.something(test)
        demo == "xxx" // fails because demo is null
    }

}

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

1 Ответ

1 голос
/ 30 апреля 2019

Существует проблема в объединении проверки с проверкой количества вызовов, потому что проверка не вызывается.

Вы можете переписать ваш комбинированный тест таким образом, чтобы он работал:

def "combined check"() {
    given:
    def test = 'my test string'

    when:
    def demo = demoService.demo(test)

    then:
    1 * downStream.something(test) >> 'xxx'
    demo == 'xxx'
}
...