0

私は似たようなGroovyクラスを持っています

class MyClass {

  Foo foo
}

特定の状況下では、fooを初期化したくないので、fooへのすべての呼び出しをスタブ化したいです。値を返すメソッドは何もしません。私はこのようにそれを行うことができます:

Foo.metaClass.method1 = {param -> }
Foo.metaClass.method2 = { -> }
Foo.metaClass.method3 = {param1, param2 -> }

これは機能しますが、いくつかの問題があります

  1. 特にFooに多くの方法がある場合は、面倒で時間がかかります
  2. これにより、(fooだけでなく)Fooの任意のインスタンスへの呼び出しがスタブされます。

GroovyはStubForクラスを提供していますが、これを行うと、次のようになります。

this.foo = new groovy.mock.interceptor.StubFor(Foo)

実行時にClassCastExceptionが発生します。fooを次のように再定義できれば、これは機能しますが、

def foo

しかし、私がここに入らない理由のために、私はそれをすることができません。

ありがとう、ドン

4

4 に答える 4

0

これはテスト目的のみだと思います。

この線:

Foo foo

ゲッター/セッターのペアを作成するので、次のようにしてテストケースにモックを挿入できます。

new MyClass().foo = new MockFoo()

自分でモックを作成したくない場合は、モックライブラリを試してください。mockitoの使用をお勧めします。この小さなライブラリを使用すると、次のようなことができます。

import static org.mockito.Mockito.*;
new MyClass().foo = mock(Foo.class);
于 2009-06-10T18:42:15.390 に答える
0

FooインスタンスをMyClassオブジェクトに渡す必要があります。テストでは、スタブ実装を渡します。実際のプログラムでは、実際の実装を渡します。

スタブを作成するために特別なフレームワークは必要ありません。Fooへのクエリをスタブするだけで、コマンドを期待することに興味がない場合は、手動でスタブ実装を作成する方が簡単です。モックオブジェクトライブラリはやり過ぎであり、テストに期待が含まれることを期待するコードの後で読者を混乱させるでしょう。

于 2009-06-10T18:25:25.253 に答える
0

マップを使用してスタブを作成することもでき、次のように複数のメソッドをスタブ化できます。

def stubbedList = [empty : { false }, get: {index -> "always return this"}] as ArrayList

クラスをスタブ化すると (上記の ArrayList の例のように)、オーバーライドしないメソッドは、クラスに実装されたまま保持されます。明らかにインターフェースをスタブ化することもできます。

モック機能 (つまり、特定のメソッドの呼び出し回数をカウントするなど、テストでの動作を検証する機能) が必要な場合は、Spock テスト フレームワークを確認することを強くお勧めします。より高度なスタブとモッキングを非常に強力にサポートします。

于 2013-08-09T19:39:36.643 に答える
0

私は解決策を見つけました:

this.foo = {Object[] args -> println "I don't do anything"} as Foo
于 2009-06-10T19:21:30.880 に答える