我不确定是否在误用基于交互的测试或者是否存在概念上的错误。我正在开发一个Spring Boot 应用程序(使用Kotlin),我的测试使用Spock/Groovy。
我有一个被测试类,它调用另一个服务来查询信息。被测试类应该缓存结果。然而,我无法模拟带有返回值的方法并检查调用次数,因为一旦添加了对调用次数的检查,模拟方法就总是返回null。
我创建了一个隔离的示例,展示了这个问题。
这是被测试的类:
@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
}
}
第一和第二个测试按预期工作,但最后一个测试失败了,因为当我添加调用检查时,返回值始终为null。
# This will not work
,将有助于发现这些信息。上面句子中的“not”很容易被忽略... 段落结束... 在视觉上很难发现。谢谢。 - user1241663