2015-10-27 20 views
1

我正在測試錯誤處理。我想第一次調用mockedObject.foo()來拋出一個新的IOException,第二次返回吧。我想下面的代碼,使用Spock在多個返回結果中拋出IOException

mockedObject.foo() >>> [{throw new IOException()}, 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 

回答

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

你應該能夠做到:

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

See here in the documentation

+0

感謝您的鏈接的文檔。不幸的是,我得到了與該代碼相同的結果。 –

+0

被測試的方法'foo()'看起來像什麼? –

+0

'foo()'未在測試中。被測方法基本上循環調用foo和處理錯誤。 –