我在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
我可以嘲笑像其他系统类System
和RunTime
这样的,但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