【问题标题】:EasyMock - Throwing NullPointerexception due to not accessible to parent class private object(i18n)EasyMock - 由于父类私有对象(i18n)无法访问而引发 NullPointerexception
【发布时间】:2020-02-18 22:21:30
【问题描述】:
A)
Class Parent4{
    private I18nUtils i18n;

    //-----------Here Nullpointerexception occur----------------
    public Parent4(){
         SetText(i18n.getText("HELLO");
    }
}

B)
Class Parent3 extends Parent4{
    private I18nUtils i18n;
}

C)
Class ParentParent2 extends Parent3{
    private I18nUtils i18n;
}

D)
Class Parent extends ParentParent2{
    private I18nUtils i18n;
}

E)
Class Child extends Parent{
    protected method_name(){
    //.......DO Something......
    }
}



My Test Class:

public testclass{
        Class cls = Class.forName("Child");
        Object obj = cls.newInstance();
        Method method = cls.getDeclaredMethod("method_name",Null);
        method.setAccessible(true);
        method.invoke(obj, null);

因此,在创建子类的对象时,它调用并调用子类的所有依赖项并使用模拟对象进行初始化,并调用所有父类及其构造函数。

虽然 i18n 默认设置为 null。 1)我试图通过反射访问。在 superClass().getDeclared("i18n") 的帮助下。但最终它只能访问它的前一个类而已。所以它没有设置 Parent5() 类的值。

2) 我也尝试直接访问 Parent5 类 i18n 字段。 但是在调用子类时。它将创建新实例,并且将 parent5() 类 i18n 重置为 null。

【问题讨论】:

  • 我不明白。您能否提供一个真正的功能齐全的核心示例来显示故障并给出完整的堆栈跟踪和发生故障的行?
  • 我正在使用简单的模拟编写一个测试用例,但我想测试的方法调用了超类方法,该方法在我的子类中也被覆盖。我想接近一个在另一种方法中取出对超类方法的调用,然后模拟这个方法而不是部分模拟。任何人都可以建议该方法是否正确,或者是否有更好的出路,或者 Easy Mock api 中已经存在一些东西来处理这种情况。
  • 从很多天开始,我都在互联网上进行同样的调查。我了解了我的一些问题。这个问题被称为“easymock-override-an-object-creation”。 (stackoverflow.com/questions/38180541/…).. 当我看干净代码谈话系列的视频时。他们谈论的是“深度继承层次结构”的同一个问题。

标签: java unit-testing nullpointerexception superclass easymock


【解决方案1】:

我会在你的一位 cmets 之后回答。

是的,调用另一个方法而不是 super 并使用部分模拟是正确的解决方案。 EasyMock 无法模拟 super

那么,如果你想模拟一个构造函数调用的方法,那确实是不可能的。 EasyMock 不提供在进行模拟之前进行模拟的方法。

在这两种情况下,修改设计可能会改进设计。

【讨论】:

    【解决方案2】:

    我可能会处理这种情况。我阅读了 Easymock 文档。从那里我得到了一些类似的案例来处理这种情况。

    代码在这里:

    Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
    child obj_1 = objenesis.newInstance(child.class);
    Method method = obj_1.getClass().getDeclaredMethod("method_name",MessageReceiver.class);
    method.setAccessible(true);
    method.invoke(obj_1, null);
    

    就我而言,它工作正常。因此,我无法在任何地方模拟父字段。

    注意:我的子类方法没有父类的任何字段依赖。只有我需要模拟 (i18n) 字段,所以它不会导致“nullpointerexception”。但最终我处理的是 objensis。

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2017-01-19
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多