【问题标题】:Jmockit mocking issueJmockit 模拟问题
【发布时间】:2015-11-13 16:13:27
【问题描述】:

我是 Junit 和 Jmockit 的新手。我写了一个例子,想用模拟来测试它,但我遇到了一个错误。

public class First {

    public static int square(int number) {

        int result = number * number;
        return result;
    }
}

public class Second {

    public static void main(String[] args) {

        int number = 5;

        number = new Second().xi(number, number);
        System.out.println(number);
    }

    public int xi(int number, int number1) {
        number = First.square(number) + First.square(number1);
        return number;

    }

}

public class SecondTest {

    Second second = new Second();

    @Test
    public void testXi() {
        new Expectations() {

            {

                First.square(5);
                result = 25;
            }

        };
        int mk = second.xi(5, 5);
        assertEquals(50, mk);
    }
}

当我尝试运行此 SecondTest.java 时,出现以下错误。

java.lang.IllegalStateException:缺少对模拟类型的调用 这点;请确保此类调用仅在 声明一个合适的模拟字段或参数 SecondTest$1.(SecondTest.java:17) 在 SecondTest.testXi(SecondTest.java:12) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我在代码中找不到任何错误。

【问题讨论】:

  • 您到底在哪里搜索过? JMockit 文档(入门页面、教程、API 文档)明确指出,在记录期望值之前,需要使用其中一种模拟注释来模拟类型。此外,这就是错误消息的含义:“...确保此类调用仅在声明合适的模拟字段或参数之后出现”。

标签: java unit-testing junit jmockit


【解决方案1】:

您应该在测试类(类级别,而不是方法级别)中声明类似@Mocked First firstInstance 的内容。

那你需要让期望firstInstance.square(5); result = 25

这实质上告诉 jmockit 您希望模拟出 First 类,并且它应该将 First 类的所有实例与实例 firstInstance 交换。然后你告诉它,你期待调用 xi(int, int) 方法的实例,值为 5, 5,并且你希望它返回 25。

【讨论】:

  • 但是 square 是一个静态方法。
  • square 是一个静态方法,是的。但 xi(int, int) 不是。
  • 但是我在尝试时遇到了这个错误。 mockit.internal.UnexpectedInvocation:意外调用:First#square(int number),参数:5 at First.square(First.java) at Second.xi(Second.java:11)
  • 啊,因为您调用了 first.square 两次,并且对此的期望非常严格。可以定义两次期望值,设置firstInstance.square(5); times = 2; result = 25; 或切换到 NonStrictExpecations
  • times=2 有帮助。我认为写一次期望就可以了。但是真的有必要提“时代”吗???
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
相关资源
最近更新 更多