如何解决在spock中调用验证void方法的最佳方法是什么
让我们说我有一个类Foo
,其中有两个无效方法bar
和biz(Object object)
public class Foo {
public void bar(){}
public void biz(Object object){}
}
这两个方法都是具有自己的测试用例的复杂方法,但是问题是bar()
调用biz(Object object)
,我想在bar的一个测试用例中对此进行验证。所以我的测试用例是在Spock中设置的。
class FooSpec {
Foo foo = new Foo()
def "test bar"() {
given:
boolean bizCalled = false
foo.metaClass.biz = {Object object -> bizCalled = true}
when:
foo.bar()
then:
0 * _
and:
bizCalled
}
}
我从this question得到了这个解决方案,问题是在这个示例中bizCalled
始终为假,即使我已经验证biz(Object object)
也是{{1} }应该设置为true。
我使用metaClass的方式是否仅仅是出了点问题,还是在spock中有更正确的方法来验证bizCalled
在Spock中调用了bar()
?
解决方法
您忘记将FooSpec
扩展为Specification
才是真正的Spock测试。如果这样做,则测试通过。这是您稍作调整并重命名的原始测试:
public class Foo {
public void bar() { biz("dummy"); }
public void biz(Object object) {}
}
import spock.lang.Specification
class InternalMethodCallTest extends Specification {
Foo foo = new Foo()
def "bar calls biz"() {
given:
boolean bizCalled = false
foo.metaClass.biz = { Object object -> bizCalled = true }
when:
foo.bar()
then:
0 * _
and:
bizCalled
}
}
但这不仅丑陋,而且是“毫无节制的”。 ?我建议您只使用Spy
来验证内部方法调用:
import spock.lang.Specification
class InternalMethodCallTest extends Specification {
Foo foo = Spy()
def "bar calls biz"() {
when:
foo.bar()
then:
1 * foo.biz(_)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。