JMockit で、実際のメソッドをトリガーする機能を維持しながら、クラス内にプライベート フィールドを挿入する方法を探しています。私はJMockitによって使用@Injectable
および提供されています。@Tested
しかし、その後どういうわけか、注入されたインスタンスは実際のメソッドを呼び出すことができません。
テスト例:
public class TestClass {
public static class DoSomething {
private Call callee;
public void execute() {
callee.call();
}
}
public static class Call {
public void call() {
System.out.println("real");
}
}
@Tested DoSomething doSomething;
@Injectable Call call;
// nothing happens
@Test
public void testRealCall() {
doSomething.execute();
}
// invocation doesn't help either
@Test
public void testRealCallSecondTry() {
new MockUp<Call>() {
@Mock
@SuppressWarnings("unused")
public void call(Invocation inv) {
inv.proceed();
}
};
doSomething.execute();
}
// this works, but requires redundant methods
@Test
public void testRealCallThirdTry() {
new MockUp<Call>() {
@Mock
@SuppressWarnings("unused")
public void call() {
System.out.println("real");
}
};
doSomething.execute();
}
@Test
public void testFakeCall() {
new MockUp<Call>() {
@Mock
@SuppressWarnings("unused")
public void call() {
System.out.println("fake");
}
};
doSomething.execute();
}
}
ここでは、メッセージを出力する方法を提供するインスタンスをDoSomething
ラップします。Call
4 つのテスト ケースの理想的な出力は次のようになります。
real
real
real
fake
ただし、実際のシナリオでは、3 と 4 のみが機能し、次のように出力されます。
real
fake
これは、インスタンスが を使用して作成されたかどうかを示します@Injectable
。古いメソッド本体をモック バージョンにコピー アンド ペーストしないと、元のメソッドを直接呼び出すことはできません。それは本当に厄介なようです。これの回避策はありますか?