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);
}
}
もっと良い方法はありますか?