Java 停止在Jmockit中嘲笑

Java 停止在Jmockit中嘲笑,java,unit-testing,junit,jmockit,expectations,Java,Unit Testing,Junit,Jmockit,Expectations,我正在使用JMockit。我在嘲笑一种方法。我希望在调用实际方法之后调用模拟方法一次。我正在提供我正在使用的代码 package StopMocking; public class ClassToMock { public int methodToMock() { return 2; } } 这是我正在测试的课程 package StopMocking; public class ClassToTest { public void metho

我正在使用JMockit。我在嘲笑一种方法。我希望在调用实际方法之后调用模拟方法一次。我正在提供我正在使用的代码

package StopMocking;
public class ClassToMock 
{
    public int methodToMock()
    {
        return 2;
    }
}
这是我正在测试的课程

package StopMocking;
public class ClassToTest 
{
    public void methodToTest()
    {
        ClassToMock classToMockInstance = new ClassToMock();
        System.out.println(""+classToMockInstance.methodToMock());
    }
}
这是测试类

package StopMocking;
import org.junit.Test;
import mockit.Mocked;
import mockit.NonStrictExpectations;
public class TestAClass 
{
    @Mocked("methodToMock") ClassToMock classToMockMockedInstance;
    @Test
    public void test1()
    {

        new Expectations(classToMockMockedInstance)
        {
            {
            classToMockMockedInstance.methodToMock();returns(1);
            }
        };

        (new ClassToTest()).methodToTest();
        //Some code for stoping mocking
        (new ClassToTest()).methodToTest();//It should display 2

    }
}
当我使用新的期望值(classToMockMockedInstance)时,它会抛出此异常

mockit.internal.MissingInvocation: Missing invocation of:
StopMocking.ClassToMock#methodToMock()
   on mock instance: StopMocking.ClassToMock@15093f1
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: Missing invocation
    at StopMocking.ClassToMock.methodToMock(ClassToMock.java)
    at StopMocking.TestAClass$1.<init>(TestAClass.java:21)
    at StopMocking.TestAClass.test1(TestAClass.java:18)
    ... 6 more
mockit.internal.MissingInvocation:缺少以下调用:
停止模仿。ClassToMock#methodToMock()
在模拟实例上:停止模拟。ClassToMock@15093f1
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因:缺少调用
at StopMocking.ClassToMock.methodToMock(ClassToMock.java)
TestAClass$1(TestAClass.java:21)
在StopMocking.TestAClass.test1(TestAClass.java:18)
... 还有6个

编写测试的一种方法是使用部分模拟和严格期望,如下所示:

public class TestAClass 
{
    @Test
    public void test1()
    {
        final ClassToMock classToMockInstance = new ClassToMock();

        new Expectations(ClassToMock.class) {{
            classToMockInstance.methodToMock(); result = 1;
        }};

        new ClassToTest().methodToTest(); // prints "1"

        // This time the real method implementation will be executed:
        new ClassToTest().methodToTest(); // prints "2"
    }
}

你能不能写两个测试,一个有模仿,另一个没有?谢谢你的兴趣@Rogério。你是对的,我可以在这个例子中编写两个测试用例。但这是一个场景。我想知道,如果JMockit或任何其他选项中有任何功能可用,则在调用原始方法后,我将只调用一次模拟方法。是的,您可以在部分模拟的实例上记录严格的期望:
新期望(someObj){…}
。只有第一次调用将符合此期望;任何附加调用都将执行实际代码。另一种方法是在Delegate方法中使用带有条件调用的
Delegate
对象来调用
procedure()
,该方法的第一个参数类型为
Invocation
。这里我不提供例子,因为官方文件中有很多这样的例子。谢谢@Rogério。当我使用期望时(ClassToMockMockedInstance)。它抛出了这个异常。我已经编辑了这个问题,还有一个问题,如何模拟接口。当我在Expections中传递接口名时,它抛出IllegalArgumentException。谢谢,有界面吗?通常情况下,你不会。通过
期望值进行部分模拟
仅适用于包含实现代码的类。