使用 Spock 在多个 return 结果中抛出 IOException
Throw IOException in multiple return results with Spock
我正在测试错误处理。我希望第一次调用 mockedObject.foo()
抛出新的 IOException,第二次调用 return 栏。我尝试了以下代码,
mockedObject.foo() >>> [{throw new IOException()}, bar]
但是,当我 运行 测试时,我收到一条错误消息,指出无法将闭包转换为 Bar,
FooSpec$_$spock_feature_0_1_closure2 cannot be cast to Bar
我如何用 Spock 模拟这种行为?
编辑:在看到 tim_yates 引用的文档后,我将测试更改为
mockedObject.foo() >>> firstBar >> {throw new IOException()} >> secondBar
这足以测试我需要测试的内容。下面的代码抛出了同样的异常,所以我猜 Spock 正在根据第一个对象 return.
设置模拟方法的 return 类型
mockedObject.foo() >>> {throw new IOException()} >> secondBar
你应该可以做到:
mockedObject.foo() >>> {throw new IOException()} >> bar
这里是一个完整的工作示例:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib:3.1')
@Grab('org.ow2.asm:asm-all:5.0.3')
import spock.lang.*
class MyTestSpec extends Specification {
def 'spec'() {
given:
def a = new A()
a.b = Mock(B) {
foob() >> { throw new Exception('aaa') } >> 1
}
when:
a.fooa()
then:
def e = thrown(Exception)
e.message == 'aaa'
when:
def r = a.fooa()
then:
r == 1
}
}
class A {
B b = new B()
Integer fooa() {
b.foob()
}
}
class B {
Integer foob() {
2
}
}
你可以尝试拆分'then'块:
然后:
1 * mockedObject.foo() >> {抛出新的 IOException()}
.....(其他一些调用断言)
然后:
1 * mockedObject.foo() >> bar.
我知道这个话题已经过时了,但也许有人仍然想找到它的解决方案。
(Spock 测试:根据调用顺序抛出异常或值)
请参考:https://spockframework.org/spock/docs/1.0/interaction_based_testing.html
调用顺序部分
我正在测试错误处理。我希望第一次调用 mockedObject.foo()
抛出新的 IOException,第二次调用 return 栏。我尝试了以下代码,
mockedObject.foo() >>> [{throw new IOException()}, bar]
但是,当我 运行 测试时,我收到一条错误消息,指出无法将闭包转换为 Bar,
FooSpec$_$spock_feature_0_1_closure2 cannot be cast to Bar
我如何用 Spock 模拟这种行为?
编辑:在看到 tim_yates 引用的文档后,我将测试更改为
mockedObject.foo() >>> firstBar >> {throw new IOException()} >> secondBar
这足以测试我需要测试的内容。下面的代码抛出了同样的异常,所以我猜 Spock 正在根据第一个对象 return.
设置模拟方法的 return 类型mockedObject.foo() >>> {throw new IOException()} >> secondBar
你应该可以做到:
mockedObject.foo() >>> {throw new IOException()} >> bar
这里是一个完整的工作示例:
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib:3.1')
@Grab('org.ow2.asm:asm-all:5.0.3')
import spock.lang.*
class MyTestSpec extends Specification {
def 'spec'() {
given:
def a = new A()
a.b = Mock(B) {
foob() >> { throw new Exception('aaa') } >> 1
}
when:
a.fooa()
then:
def e = thrown(Exception)
e.message == 'aaa'
when:
def r = a.fooa()
then:
r == 1
}
}
class A {
B b = new B()
Integer fooa() {
b.foob()
}
}
class B {
Integer foob() {
2
}
}
你可以尝试拆分'then'块:
然后: 1 * mockedObject.foo() >> {抛出新的 IOException()}
.....(其他一些调用断言)
然后: 1 * mockedObject.foo() >> bar.
我知道这个话题已经过时了,但也许有人仍然想找到它的解决方案。 (Spock 测试:根据调用顺序抛出异常或值) 请参考:https://spockframework.org/spock/docs/1.0/interaction_based_testing.html 调用顺序部分