4

Groovy、JUnit、EasyMockを使用してJavaアプリケーションの単体テストを作成します。EasyMockにはcapture()、「消去の強制がより難しいため、Java 7でコンパイルされない」という注記で非推奨になっている、いくつかのオーバーロードされたメソッドがあります。メソッドは、パラメータとしてタイプのオブジェクトを取りますCapture<T>。特に、次の方法があります。

  • static boolean capture(Capture<Boolean> captured)
  • static boolean capture(Capture<Integer> captured)
  • ..。
  • static <T> T capture(Capture<T> captured)

これはJavaでは許可されなくなりましたが、Javaから直接そのコードを呼び出すと、適切なメソッドが呼び出されます。たとえば、このコードを実行するとき

Capture<MyClass> myClassCapture = new Capture<MyClass>();
mockObject.someMethod(capture(myClassCapture));

正しいメソッド(リストの最後)が呼び出されます。

一方、Groovy内から同じコードを呼び出すと、リストの最初のメソッドが呼び出され、テストでエラーが発生します。これは、JavaとGroovyがメソッドを解決する方法に関係していると思います。私の仮定では、Javaはコンパイル時にメソッドをバインドし、Groovyは実行時にメソッドを見つけようとし、見つけたメソッド(おそらく最初のメソッド)を取得します。

誰かがここで何が起こっているのかを正確に説明できますか?これは、JavaとGroovyの動作の違いをより正確に理解するのに役立ちます。

Groovy内の呼び出しをJavaメソッドに委任することで修正しました。Javaメソッドは私のために仕事をします。

public class EasyMockUtils {

    public static <T> T captureObject(Capture<T> captureForObject) {
        return EasyMock.capture(captureForObject);
    }
}

もっと良い方法はありますか?

4

2 に答える 2

1

EasyMock 3.0 を使用して、自分でこの問題を解決してください。ただし、EasyMock 3.2 の時点で、ラップされたプリミティブを使用するすべてのメソッドの名前を変更し、キャプチャ メソッドを 1 つだけ残すことで解決されたようです。

詳細については、3.2 ドキュメントを確認してください: http://easymock.org/api/easymock/3.2/org/easymock/EasyMock.html#capture%28org.easymock.Capture%29

于 2013-11-14T16:24:48.233 に答える
0

Groovy 2.0 の @CompileStatic を使用してみてください - 問題が解決するかもしれません

于 2012-06-11T12:54:15.860 に答える