我正在 JMockit 中寻找一种在类中注入私有字段的方法,同时保持触发真实方法的能力。我使用@Injectable
并由@Tested
JMockit 提供。但不知何故,注入的实例无法调用真正的方法。
示例测试:
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
实例,它提供了一种打印消息的方法。四个测试用例的理想输出是:
real
real
real
fake
然而实际情况是只有 3 和 4 工作,打印:
real
fake
这显示了是否使用@Injectable
. 如果不将旧方法体复制并粘贴到模拟版本,则无法直接调用原始方法。这似乎真的很尴尬。有解决方法吗?