发现非常有趣的问题,并在调试后找到了重现它的场景。
因此,如果我有一个包范围 B 的类,该类具有一些公共方法和扩展它的公共类 A:
package somepackage;
class B {
public void someMethod() {
throw NullPointerException();
}
}
package somepackage;
public class A extends B {
}
然后在测试中:
A a = mock(A.class);
a.someMethod();
你猜怎么着,我收到了刚刚抛出的 NullPointerException 异常,因此 Mockito 以某种方式创建了一个“真实”对象并调用了一个真实方法而不是模拟方法。为什么这样?
java.lang.IllegalArgumentException
at test.B.setProxy(B.java:6)
at test.A.setProxy(A.java:1)
at secretservice.service.TestFDSServiceImpl.testService(TestFDSServiceImpl.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
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)
在上面的例子中我有IllegalArgumentException
因为我在课堂上改变了它B
只想确认一下NullPointerException
不是由其他原因引起的。
Eclipse:Juno 服务版本 1,构建 ID:20120920-0800
Mockito:1.8.4(也使用 1.9.5 进行了测试)
JUnit:4.10
edit
最新的mockito 2.x beta 现在使用ByteBuddy,它不受此问题的影响。可能还需要进行一些 API 调整,但它几乎既有效又实用。此外,与现有的mockito匹配器的兼容性也会被破坏。如果这对项目来说没问题,那么在mockito 2 处于测试阶段时获得有关API 的反馈就太好了。
original
当模拟类具有非公共父类时,存在一个已知问题。该方法不能被存根。看第212期.
问题在于,桥接方法是由编译器生成的,以便从父级访问该方法,但这会让 CGLIB 等字节码工具感到困惑。除非你能修复CGLIB,否则没有真正的解决方案。
抱歉,您必须以不同的方式解决此问题:/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)