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

Mockito-奇怪的包作用域类继承问题

颛孙成益
2023-03-14
问题内容

发现了一个非常有趣的问题,并在调试后找到了重现该问题的方案。

因此,如果我有一个包范围为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 Service Release 1,内部版本号:20120920-0800
Mockito:1.8.4(也已通过1.9.5测试)JUnit:4.10


问题答案:

编辑

最新的嘲笑2.x
Beta现在使用ByteBuddy,不受此问题的影响。可能还需要进行一些API调整,但实际上既可以工作,也可以工作。与现有的模仿匹配器之间的兼容性也将打破。如果该项目还可以,那么在嘲笑2处于beta状态时获得有关该API的反馈会很棒。

原版的

当模拟的类具有非公共父级时,存在一个已知问题。该方法不能存根。参见问题212。

问题在于,桥方法是由编译器生成的,以便从父级访问该方法,但这会使诸如CGLIB的字节码工具感到困惑。除非您可以修复CGLIB,否则没有真正的解决方案。

抱歉,您必须以其他方式解决此问题:/



 类似资料:
  • 发现了一个非常有趣的问题,在调试后找到了重现它的场景。 因此,如果我有一个具有包范围B的类,它有一些公共方法和扩展它的公共类A: 然后在测试中: 你猜怎么着,我得到了我刚刚抛出的NullPointerException,所以Mockito以某种方式创建了一个“真实”的对象,并调用了一个真正的方法,而不是一个被嘲笑的方法。为什么会这样? 在上面的示例中,我在类<code>B<code>中更改了<co

  • 我在单元测试下面的Spring MVC控制器方法: 上面的自定义注释()基本上是由以下方面建议的: 如果抛出了一个,则会启动以下控制器建议异常处理程序: 现在,以下是我如何尝试测试上述控制器方法: 测试系统地失败了,下面的堆栈跟踪: 我不确定我和莫奇托有什么问题... 注意,我确实在路径中指定了,这表明我的模拟应该在方面中返回true,并允许控制器方法继续。然而,事实并非如此。 谁能帮忙吗?

  • 问题内容: 这是目录树: 在main.go中: 在client_test.go中: 错误: 我已经阅读了如何在golang中使用自定义软件包?而且我认为我有和这个人一样的解决方案,但是我只是不知道如何解决这个问题。请帮忙。 去环境: 问题答案: 命令去,测试包。 名称与文件模式“ * _test.go”匹配的文件可以包含测试函数,基准函数和示例函数。 不要使用保留名称。例如,将与贯穿始终。

  • 本文向大家介绍详解angular中的作用域及继承,包括了详解angular中的作用域及继承的使用技巧和注意事项,需要的朋友参考一下 在一些使用angular框架的大型项目中,似乎有很多个controller,而每个controller都有自己的$scope. 1、$rootscope $rootScope顶级作用域,也叫根作用域,类似于window,window的属性在任何子作用域都可以访问。$r

  • 问题内容: 当我运行以下Jenkins管道脚本时: 我收到此错误: 如果从中删除,则可以正常工作。有人可以解释导致此行为的作用域规则吗? 问题答案: TL; DR 定义的变量 与 主脚本主体不能从其他方法来访问。 定义的变量 ,而不 能够直接通过任何方法甚至从不同的脚本访问。这是一个坏习惯。 使用 和 注释定义的变量可以直接从同一脚本中定义的方法访问。 说明 当groovy编译该脚本时,它实际上将

  • 问题内容: 我正在寻找一种奇妙的方式来防止闭合继承周围的scrope。例如: 我知道只有 两种方法可以 防止共享范围: (1)使用阴影变量: (2)将函数体放在其他位置: 我的问题是-有人知道防止闭包继承JS范围的第三种方法吗?花哨的东西很好。 我认为唯一可行的方法是在Node.js中。 让我们利用想象力来思考一下,并假设JS有一个private关键字,这意味着变量仅在该函数的作用域内是私有的,如