2017-12-06 14 views
0

私は閉鎖して呼び出しを行う方法、このような何かをテストしようとしている中でクロージャの内部に取り込む引数:スポック

def foo(Long param) { 
    AnObject.doSomething { 
     bar(param) 
    } 
} 

をそして、私はそのdoSomethingをテストするには閉鎖と呼ばれています内部で期待値のbarが呼び出されます。

私はスパイを作成し、

when: 
    service.foo(1L) 
then: 
    1 * AnObject.doSomething{_} 

を行うことによって、適切doSomething呼び出しをテストすることができるよしかし、私は閉鎖の内容にアサーションを実行する方法を見つけるように見えることはできません。

閉鎖の内部をアサートする適切な方法は何ですかbarは1Lで呼び出されますか?

答えて

0

あなたのコードをもっと見ることなく、バーメソッドを提供するクラスを偵察する必要があると思います。これは、テストがクロージャを提供しているので少し工夫しましたが、私はそれがこのようなものだと思います:

import spock.lang.Specification 

class Bar { 
    void bar(def param) { 
     println param 
    } 
} 

class DoSomethingTestSpec extends Specification { 

    class AnObject { 

     void doSomething(Closure c) { 

      def param = 1L 

      c.call(param) 
     } 
    } 

    def "test AnObject doSomething calls the closure"() { 

     given: 
     def closure = { def p -> 
      Bar.bar(p) 
     } 

     and: 
     GroovySpy(Bar, global:true) 

     and: 
     AnObject anObject = new AnObject() 

     when: 
     anObject.doSomething(closure) 

     then: 
     1 * Bar.bar(_) >> { args -> 
      assert args[0] == 1L 
     } 
    } 
}