2011-03-06 11 views
5

コントローラーが正しい引数でサービスメソッドを呼び出すことをテストしたい。それをする最善の方法は何ですか?Grails mockForとメソッドの最適なテスト方法正しい引数で呼び出される

現在の計画では、mockForを使用して、クロージャーで渡された値をチェックします。mockForまたはmockitoを使ってこの同じメソッドを実行するのに似たようなテストを行う良い方法がありますか?呼び出し引数の値のテスト?

class HappyControllerTests extends ControllerUnitTestCase { 
     : 
    void testSomeValue() { 
     def mockControl = mockFor(HappyService) 
     def givenSomeItem = null 
     mockControl.demand.serviceMethod(1..99) { String someItem -> givenSomeItem = someItem; } 
     controller.happyService = mockControl.createMock() 

     controller.someAction() 

     mockControl.verify() 
     assertEquals("specific value", givenSomeItem) 
    } 
} 

ありがとうございます!私はで動作するように簡単に、より強力であることをメタクラスのものとas ClassNameに組み込まれているグルーヴィー見つけるよう

+0

私は「テッドNaleid」からの回答が好き。しかし、IMHOの大規模店では、mockFor(..)を使用する必要があります。http://grails.org/doc/latest/guide/9.%20Testing.html#9.2統合テストを参照してください。 "...これらのメソッドを使用すると、与えられたクラスには他のテストに漏れません.. " – finneycanhelp

答えて

13

が、私はめったにmockForを使用していない、私はこれを行うだろう:

void testSomeValue() { 
    def givenSomeItem = null 
    controller.happyService = [ 
     serviceMethod: { String someItem -> givenSomeItem = someItem } 
    ] as HappyService 

    controller.someAction() 
    assertEquals "specific value", givenSomeItem 
} 
+1

コード例ありがとうございます。 1)私はJeff Brownの素晴らしいプレゼンテーションに行き、彼と話しました。 2)テストのsetup()で、クラスのすべてのインスタンスに対してmetaClassが操作され、正しく復元されていないことがわかりました。これはテスト全体で副作用の行動を引き起こし、私は起こっていたことを捜した者でした。ですから、GroovyのmetaClassをオブジェクトモックに使用することは可能ですが、他のものにはmockForを使用できますが、大きなJavaショップではmockForを使用することをお勧めします。 – finneycanhelp

+1

クラスのメタクラスを変更すると、通常は問題が発生します。上記の例のようにインスタンスを変更するだけの場合は、ほとんどの場合安全です。変更はインスタンスの存続期間中のみ有効です。私がこの問題にぶつかった唯一の時間は、シングルトンである注入された春のインスタンスを嘲笑したときです。その同じインスタンスが他の場所に注入されていたので、変更後もテスト後に破棄されませんでした。私はあなたには完全に同意していませんが、人がGroovyにあまり慣れていないのであれば、Javaの店でもっとうまくいくかもしれません。 –

+0

これは本当に素晴らしいです – tbruyelle

関連する問題