当前位置: 首页 > 知识库问答 >
问题:

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)

在上面的示例中,我在类<code>B<code>中更改了<code>IllegalArgumentException

Eclipse:Juno服务版本1,构建id:20120920-0800 Mockito:1.8.4(也使用1.9.5测试)JUnit:4.10

共有1个答案

澹台逸明
2023-03-14

编辑

最新的mockito 2. x测试版现在使用ByteBuddy,它不受此问题的影响。可能还需要一些API调整,但它几乎可以正常工作和正常工作。此外,与现有mockito匹配器的兼容性也会中断。如果这对项目来说没问题,那么在mockito 2处于测试阶段时获得有关API的反馈会很好。

原始的

当被模仿的类有一个非公共的父类时,有一个已知的问题。该方法不能被存根化。见第212期。

问题是编译器生成桥接方法是为了从父级访问该方法,但是这会混淆像CGLIB这样的字节码工具。除非您可以修复CGLIB,否则没有真正的解决方案。

很抱歉,您必须以不同的方式解决这个问题:/

 类似资料:
  • 问题内容: 发现了一个非常有趣的问题,并在调试后找到了重现该问题的方案。 因此,如果我有一个包范围为B的类,该类具有某些公共方法,而公共类A对其进行了扩展: 然后在测试中: 猜猜是什么,我得到了我刚刚抛出的NullPointerException,所以Mockito以某种方式创建了一个“真实”对象并调用了真实方法,而不是模拟了一个方法。为什么这样? 在上面的示例中,我在课堂上进行了更改,以确保不是

  • 问题内容: 在父控制器作用域中,我已定义将其设置为“ x”。然后在子范围中,我使用ngModel 进行了定义: 加载页面后,会按预期正确设置为“ x”。当我选择“ y”时,在CtrlB中$ scope会按预期给出“ y”。 但是,当我检查的范围(使用AngularJS的batarang),它给“X”。 jsFiddle:http : //jsfiddle.net/sudhh/GGKjp/2/ 预览

  • 问题内容: 我是Angular的新手,所以我想按照教程学习,只是不懂而已。令我困惑的是点符号: 在任何输入框中键入一个值将更新所有其他输入框。因此,我认为这是控制器外部的第一个声明将输入元素值绑定到根作用域中的data.message模型。我不明白里面的绑定是如何从中读取值的。根作用域,为什么插入作用域内的值将显示在该作用域外的输入框中? 另外如果被删除 那个行为不见了,怎么会这样? 问题答案:

  • 问题内容: 使用定义控制器的原始方法 ,访问父级的作用域非常简单,因为子级作用域原型继承自其父级。 Controller-As方法 似乎是声明控制器的推荐方法。但是,对于Controller-A,上述方法不再有效。 当然,我可以通过View 访问父作用域: 我确实有一些问题(意大利面条代码可能存在),但是这个问题是关于从子控制器访问父作用域的。 我看到此工作的唯一方法是: 因此,现在,子控制器需要

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

  • 问题内容: 我在es-discuss邮件列表中遇到了以下代码: 这产生 为什么这是代码的结果?这里发生了什么事? 问题答案: 了解此“ hack”需要了解几件事: 为什么我们不只是做 如何处理论点 如何处理多个参数 函数如何处理参数 是什么呢 它们是javascript中相当高级的主题,因此它的时间要长得多。我们将从顶部开始。系好安全带! 1.为什么不只是? 什么是数组,真的吗?包含整数键的常规对