Spock 验证 mock 抛出的异常以及 mock 交互
Spock verifying an exception thrown by mock together with mock interaction
我遇到的问题是,当我尝试在 then
块中验证是否抛出了异常,并且已经对模拟进行了调用。
看看下面的设置:
class B {
def b(A a) {
a.a()
}
}
class A {
def a() {
}
}
def "foo"() {
given:
def a = Mock(A)
a.a() >> { throw new RuntimeException() }
B b = new B()
when:
b.b(a)
then:
thrown(RuntimeException)
1 * a.a()
}
以上测试失败并显示消息:Expected exception java.lang.RuntimeException, but no exception was thrown
,但设置模拟的代码明确抛出异常。
有趣的是,如果您删除最后一行:1 * a.a()
测试通过。在 then 块中放置另一个不验证异常的断言时,我没有遇到类似的问题。
有什么想法吗?
应按以下方式配置和验证:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')
import spock.lang.*
class Test extends Specification {
def "foo"() {
given:
def a = Mock(A)
B b = new B()
when:
b.b(a)
then:
thrown(RuntimeException)
1 * a.a() >> { throw new RuntimeException() }
}
}
class B {
def b(A a) {
a.a()
}
}
class A {
def a() {
}
}
如果您同时模拟和验证交互,则应在 where
/then
块中配置模拟行为。
我遇到的问题是,当我尝试在 then
块中验证是否抛出了异常,并且已经对模拟进行了调用。
看看下面的设置:
class B {
def b(A a) {
a.a()
}
}
class A {
def a() {
}
}
def "foo"() {
given:
def a = Mock(A)
a.a() >> { throw new RuntimeException() }
B b = new B()
when:
b.b(a)
then:
thrown(RuntimeException)
1 * a.a()
}
以上测试失败并显示消息:Expected exception java.lang.RuntimeException, but no exception was thrown
,但设置模拟的代码明确抛出异常。
有趣的是,如果您删除最后一行:1 * a.a()
测试通过。在 then 块中放置另一个不验证异常的断言时,我没有遇到类似的问题。
有什么想法吗?
应按以下方式配置和验证:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')
import spock.lang.*
class Test extends Specification {
def "foo"() {
given:
def a = Mock(A)
B b = new B()
when:
b.b(a)
then:
thrown(RuntimeException)
1 * a.a() >> { throw new RuntimeException() }
}
}
class B {
def b(A a) {
a.a()
}
}
class A {
def a() {
}
}
如果您同时模拟和验证交互,则应在 where
/then
块中配置模拟行为。