【问题标题】:Stopping mocking in Jmockit停止在 Jmockit 中模拟
【发布时间】:2014-06-11 06:19:03
【问题描述】:

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

    }
}

当我使用 new Expectations(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

【问题讨论】:

  • 你不能只写两个测试,一个有模拟,另一个没有吗?
  • 感谢您对@Rogério 的关注。你是对的,我可以在这个特定的例子中编写两个测试用例。但这是一个场景。我想知道,如果 JMockit 中有任何功能可用,或者我模拟的方法的任何其他选项将在调用该原始方法后仅调用一次。
  • 是的,您可以在部分模拟的实例上记录 严格 期望:new Expectations(someObj) { ... }。只有第一次调用会符合这个期望;任何额外的调用都会执行真正的代码。另一种方法是在委托方法中使用Delegate 对象和对proceed() 的条件调用,该对象将具有Invocation 类型的第一个参数。我不会在这里提供示例,因为官方文档有很多。
  • 谢谢@Rogério。当我使用期望(ClassToMockMockedInstance)时。它正在抛出这个异常。
  • 我已经编辑了异常的问题

标签: java unit-testing junit jmockit expectations


【解决方案1】:

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

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"
    }
}

【讨论】:

  • 另一个问题,如何部分模拟接口。当我在 Expectations 中传递接口名称时,它会抛出 IllegalArgumentException。谢谢
  • 部分模拟接口?通常情况下,你不会。通过Expectations 进行的部分模拟仅适用于包含实现代码的类。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2021-01-07
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多