使用Jmockit的Expectations模拟测试中的类的私有方法时出现IllegalStateException

时间:2017-09-23 03:47:52

标签: java mocking illegalstateexception jmockit private-methods

我正在使用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)

我不知道并寻求帮助。

1 个答案:

答案 0 :(得分:0)

以下是答案:http://jmockit.org/changes.html#1.23

  

在使用Expectations API时,不再支持模拟私有方法/构造函数,以防止滥用。如果仍然需要,可以使用MockUp来模拟或删除它们。

根据此更改,自v1.23起无法通过Expectations API模拟私有方法。 :(