当前位置: 首页 > 面试题库 >

为什么我不能使用JMockit模拟数学

孙博艺
2023-03-14
问题内容

我在java.lang.Math使用JMockit(1.21)模拟时遇到问题。请参阅以下内容,以简化我的实际课程。基本上我在我的代码中使用了某个地方,我Math.pow(...)希望对其进行模拟。

public final class Calculator {
    public final double power(double base, double exponent) {
        return Math.pow(base, exponent);
    }
}

至于我的测试代码,此测试有效。

@Test
public void simpleTestWithoutMock() {
    Calculator calculator = new Calculator();
    double result = calculator.power(2, 3);
    assertThat(result).isEqualTo(8);
}

该测试失败。

@Test
public void simpleTestWithMock(@Mocked Math math) {
    new Expectations() {{ // This would be line 67 in below stracktrace
        Math.pow(2,3); result = 1;
    }};

    Calculator calculator = new Calculator();
    double result = calculator.power(2, 3);
    assertThat(result).isEqualTo(1);
}

我收到的错误消息:

java.lang.NoClassDefFoundError: nl/endran/sandbox/CalculatorTest$1

        at nl.endran.sandbox.CalculatorTest.simpleTestWithMock(CalculatorTest.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
        Caused by: java.lang.ClassNotFoundException: nl.endran.sandbox.CalculatorTest$1
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 9 more

我可以嘲笑像其他系统类SystemRunTime这样的,但Math只是似乎没有工作(也没有String为此事)。我知道如何规避这是我的考验,所以我没有受到任何阻碍,但我不明白为什么Math不能嘲笑。删除Expectations块将不再导致NoClassDefFoundError错误。我怀疑具有签名的方法会在其中public static native发挥作用,但是我什么也找不到。


问题答案:

因为1)java.lang.Math(尤其是)中的方法 一直 被JRE的其他类Math.min(a, b)调用(例如,向内看),以及2)当JMockit模拟一个类(无论如何都带有)时,它会在的持续时间内被模拟测试,无论呼叫来自 何处
java.lang.String``@Mocked

最重要的是,除非您真的知道自己在做什么,否则不要嘲笑低级JRE类。在这种特殊情况下,JMockit可能应该拒​​绝对的完整模拟java.lang.Math,因为确实没有充分的理由(据我所知)。



 类似资料:
  • 上面还有第二个问题。当我在Expects块中定义mock类时(如上),似乎只调用了构造函数,而不是,因此没有正确初始化对象。我通过将它移到方法中并在那里实例化该类来解决这个问题。看起来是这样的: 因此,这似乎得到了要调用的正确构造函数,但似乎还在调用。有什么见解吗?

  • 问题内容: 我正在使用ApplicationTestCase测试一个Android应用程序。我想模拟我的AsyncTasks之一(示例简化为显示问题): 因此,为了设置测试,我做了以下工作: 然后,实际测试如下: 但是运行时出现异常: 为什么模拟AsyncTask的技术不起作用? 请注意,在这种简单情况下,删除会导致问题消失,但是对于我的实际测试,我确实需要创建应用程序。 问题答案: AsyncT

  • 考虑以下示例: 我的GCC 9.2.0无法编译并出现以下错误: 但是,工作正常。为什么会这样?如何使用显式模板参数调用foo?

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 我正在研究如何使用Mockito和Junit,现在测试一些片段。我不明白为什么我在Mock注释后在下面的代码中有NPE: 但是代码的第一部分工作得很好,尽管据我所知,这两个部分都是这样做的。 编辑:堆栈跟踪: null