此测试仅在测试条件时有效。当与交互测试混合时,它会失败。
class Test extends Specification {
class Inner {
public String greet() {
return "hello"
}
}
def "simple test"() {
given:
def inner = Mock(Inner)
inner.greet() >> { "hi" }
when:
def msg = inner.greet()
then:
1 * inner.greet() // Below will pass when this line commented out.
msg == "hi"
}
}
当删除交互测试时,测试将通过。
Condition not satisfied:
msg == "hi"
| |
| false
null
答案 0 :(得分:1)
让我们谈谈发生了什么。 (或者,如果您不想,请阅读“Scope of Interactions”部分。)
正在发生的是范围界定问题。你可能知道,你可以有多个连续的/然后对;在then块中完成的任何Mocking实际上只限于它的块时。如果Mocked方法已在when / then范围之外定义,会发生什么?在then块中定义的模拟优先。
恭喜!您偶然发现了仅方式来覆盖已建立的Mocked值/方法。在新文档发布之前,我花了很长时间弄清楚它是如何工作的。
因此我们知道您正在覆盖定义要返回的值的模拟器。我们如何从这里开始?
given:
def inner = Mock(Inner)
1 * inner.greet() >> message
expect:
"hi" = inner.greet()
where:
message = "hi"
分手思考......我希望你没有测试你在测试中设置的值。这有效地断言1 == 1.如果你想在测试行为时测试你的实际代码我建议使用间谍
given:
def inner = Spy(Inner)
1 * inner.greet() >> {
callRealMethod() // Actual method, read the documentation I linked
}
expect:
"hi" = inner.greet()
答案 1 :(得分:0)
应该是:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')
import spock.lang.*
class Test extends Specification {
class Inner {
public String greet() {
return "hello"
}
}
def "simple test"() {
given:
def inner = Mock(Inner)
when:
def msg = inner.greet()
then:
1 * inner.greet() >> "hi"
msg == "hi"
}
}