2011-07-20 11 views
0

私の単体テストの1つで、模擬メソッドを実行するのが難しいです。私はICFServiceのgetAllIC()を介して人を作成し、私のコントローラクラスの詳細の内部Grails Unit Testのためのメソッドを模擬してください

void testExample() { 
    def mockICFService = new MockFor(ICFService) 
    ... 

    //Mock the methods 
    controller.metaClass.icfList = { def person -> 
     println "icfList" 
     return [new IC(conceptId:'12345')] 
    } 
    mockICFService.demand.getAllIC(1..1) { def id, def withHist, def appId -> 
     println "mocking service" 
     return new Person() 
    } 
    ... 

    def model = controller.detail() 
} 

:私は、次のテストコードを持っています。この部分は正しく動作します。ただし、後でこの関数では、icfList(コントローラで定義されています)の呼び出しがあります。 printlnを通して、空の配列を返していますが、呼び出しがまだ行われていると判断しました。これは、配列がservletContextのデータに基づいて作成されているためだと思いますが、ユニットテストではそれにアクセスできません(したがって、私はそれを模擬しようとしています)。

コントローラで実際のメソッドを呼び出すのではなく、実際のテストで強制的にcontroller.icfListを使用する方法を知っている人はいますか?

答えて

1

あなたのコードを試してみると、私にとって爆発的なのは嘲笑されたサービスであり、正しく動作する部分は嘲笑されたicfList()メソッドです。興味深いことに、あなたの観察の反対です。それが価値があるのは、私がしたことです:

まず、新しいMockFor()クラスのインスタンスをmockFor()メソッドで置き換えます。次にモックサービスをコントローラに注入する必要があります。あなたがまったくのServletContextを使用していないので、icfList()とgetAllICの唯一の嘲笑のバージョン、上記のようにすることで

def mockICFService = mockFor(ICFService) 
controller.iCFService = mockICFService.createMock() 

は()、と呼ばれます。詳細はGrails testing documentationをご覧ください。

+0

助けてくれてありがとうジョーダン!私はmockForのアドバイスを使って作業を進め、getICF()(主にPROPERコントローラーでオーバーライドしていることを確認しています...)を嘲笑した方法に少し変更を加えました。 –

+0

うれしかった! –