使用Spock在多个返回结果中抛出IOException

时间:2015-10-27 15:58:22

标签: groovy spock

我正在测试错误处理。我希望第一次调用mockedObject.foo()抛出一个新的IOException,第二次调用返回bar。我尝试了以下代码,

mockedObject.foo() >>> [{throw new IOException()}, bar]

但是,当我运行测试时,我收到错误,指出无法将闭包转换为Bar,

  

FooSpec $ _ $ spock_feature_0_1_closure2无法投放到Bar

如何使用Spock模拟此行为?

编辑:看到tim_yates引用的文档后,我刚刚将测试更改为

mockedObject.foo() >>> firstBar >> {throw new IOException()} >> secondBar

这足以测试我需要测试的内容。下面的代码引发了相同的异常,因此我猜测Spock正在根据第一个对象返回设置模拟方法的返回类型。

mockedObject.foo() >>> {throw new IOException()} >> secondBar

3 个答案:

答案 0 :(得分:2)

你应该可以这样做:

mockedObject.foo() >>> {throw new IOException()} >> bar

See here in the documentation

答案 1 :(得分:1)

这里有一个完整的工作示例:

@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
    }
}

答案 2 :(得分:0)

您可以尝试拆分“then”块:

然后: 1 * mockedObject.foo() >> {throw new IOException()}

....(其他一些调用断言)

然后: 1 * mockedObject.foo() >> bar.

我知道这个话题很老,但也许有人仍然想找到它的解决方案。 (Spock 测试:根据调用顺序抛出异常或值) 请参考:https://spockframework.org/spock/docs/1.0/interaction_based_testing.html 调用顺序部分