我正在使用jmockit-1.26来模拟测试中的类的私有方法。 我已成功通过MockUp模拟这些方法。但它比期望更复杂。我尝试使用Expectations来做到这一点。但是在运行测试类时我得到了IllegalStateException。
受测试的课程:
public class ClassUnderTest1
{
public String publicMethod1()
{
return privateMethod1();
}
private String privateMethod1()
{
return "The real privateMethod1";
}
}
使用期望的测试类:
@RunWith(JMockit.class)
public class TestCase1
{
@Tested
private ClassUnderTest1 t1;
@Test
public void test()
{
new Expectations(t1)
{
{
Deencapsulation.invoke(t1, "privateMethod1");
result = "Mocked privateMethod1";
times = 1;
}
};
// This MockUp works fine.
// new MockUp<ClassUnderTest1>(t1)
// {
// @Mock
// private String privateMethod1()
// {
// return "Mocked privateMethod1";
// }
// };
System.out.println(t1.publicMethod1());
}
}
运行测试用例时的异常:
java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter
at jmockit.TestCase1$1.<init>(TestCase1.java:32) <- This line is result = "Mocked privateMethod1";
at jmockit.TestCase1.test(TestCase1.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我不知道并寻求帮助。
答案 0 :(得分:0)
以下是答案:http://jmockit.org/changes.html#1.23
在使用Expectations API时,不再支持模拟私有方法/构造函数,以防止滥用。如果仍然需要,可以使用MockUp来模拟或删除它们。
根据此更改,自v1.23起无法通过Expectations API模拟私有方法。 :(