Я не уверен, что неправильно использую тестирование, основанное на взаимодействии, или я делаю что-то неправильно.Я работаю над 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
}
}
Первые два теста работают как положено, но последний не проходит, потому что возвращаемое значение всегда равно нулю, когда я добавляю проверку для вызова.