20

以下に示すようなサービスクラスでmethodA()のテストを作成しています。

Class SampleService {
  def methodA(){
     methodB()
  }

  def methodB(){
  }
}

methodA()をテストするときは、methodA()をテストするときにmethodB()の呼び出しをモックできる必要があります。私はバージョン2.0.xのgrailsを使用しています。1.3.xディストリビューションでは、このようなセルフモックを作成します

def sampleServiceMock = mockFor(SampleService) 
sampleServiceMock.demand.methodB { -> } 

ただし、これは2.0.xバージョンでは機能しません。methodA()をテストするときにmethodB()をモックする他の方法は何でしょうか。

4

2 に答える 2

37

この種の問題については、実際にはモックを避け、組み込みの groovyProxy 機能を使用して、クロージャーのマップをプロキシ オブジェクトとしてキャストします。これにより、いくつかのメソッドがオーバーライドされたインスタンスが得られますが、他のメソッドは実際のクラスに渡されます。

class SampleService {
    def methodA() {
        methodB()
    }

    def methodB() {
        return "real method"
    }
}

def mock = [methodB: {-> return "mock!" }] as SampleService

assert "mock!" == mock.methodA()
assert "real method" == new SampleService().methodA()

インスタンスのみを変更し、1 行で実行でき、クリーンアップが必要なインスタンス以外のメタクラスを台無しにしないことが気に入っています。

于 2012-04-18T13:52:52.043 に答える
13

Groovy には多くのモックの代替手段があります。Mocksの代わりに Maps と Expandos を使用したり、 Mocks の代わりに Closures を使用したりするGroovy Mocksのドキュメントをいくつか見ることができます。

あなたの例では、Groovy のメタプログラミング機能を使用します。

void testMethodA() {
    service = new SampleService()
    service.metaClass.methodB = { -> return "what you want" }
    service.methodA()
    assert "your condition"
}
于 2012-04-18T08:25:40.063 に答える