2016-08-10 13 views
3

私はSpockテストフレームワークを使用しています。Spockでは、「then」ブロックから重複したやりとりを排除する方法はありますか?

def assertMockMethodsInvocations() { 
    1 * mock.method1(...) 
    2 * mock.method2(...) 
} 

はその後に、このヘルパーメソッドを呼び出します。

def "test"() { 
    when: 
    doSomething() 
    then: 
    1 * mock.method1(...) 
    2 * mock.method2(...) 
} 

私はヘルパーメソッドに「それから」ブロックのコードを移動したい:私はこれに類似した構造で多くのテストを持っています次のように私の仕様のコードの重複を排除:

def "test"() { 
    when: 
    doSomething() 
    then: 
    assertMockMethodsInvocations() 
} 

はしかし、私はヘルパーメソッドでn * mock.method(...)を配置するときにメソッド呼び出しを一致させることができません。次の例は示しています

// groovy code 
class NoInvocationsDemo extends Specification { 

    def DummyService service 

    def "test"() { 
     service = Mock() 

     when: 
     service.say("hello") 
     service.say("world") 

     then: 
     assertService() 
    } 

    private assertService() { 
     1 * service.say("hello") 
     1 * service.say("world") 
     true 
    } 

} 

// java code 
public interface DummyService { 
    void say(String msg); 
} 

// [RESULT] 
// Too few invocations for: 
// 
// 1 * service.say("hello") (0 invocations) 
// 
// Unmatched invocations (ordered by similarity): 
// 
// 1 * service.say('hello') 
// 1 * service.say('world') 
// 
// Too few invocations for: 
// 
// 1 * service.say("world") (0 invocations) 
// 
// Unmatched invocations (ordered by similarity): 
// 
// 1 * service.say('world') 
// 1 * service.say('hello') 

どのように私は私のthen:ブロックから重複したコードを削除することができますか?

+1

素晴らしいですが、質問がありますか? –

+1

'n * mock.method(...)'はシンタックスシュガーであるため、この機能は使用できません。これを別の方法で使用すると、期待どおりに機能しません。メソッド呼び出しを取得しません。 @ScaryWombat – bitweaver

答えて

2

実際、私はこの問題を解決する簡単な方法を見つけました。私たちがする必要があるのは、interactionブロックにヘルパーメソッドをラップすることです。

then: 
interaction { 
    assertService() 
} 
+0

それについて知らなかった。ニース! – heenenee

関連する問題