EasyMock - выдает исключение NullPointerexception из-за недоступности частного объекта родительского класса (i18n) - PullRequest
2 голосов
/ 22 октября 2019
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) Также я попытался получить прямой доступ к полю i18n класса Parent5. Но при вызове дочернего класса. Он создаст новый экземпляр и так же сбросит родительский класс i18n класса parent5 () как ноль.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Я, наверное, справляюсь с этой ситуацией. Я прочитал документацию 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.

0 голосов
/ 29 октября 2019

Я отвечу после одного из ваших комментариев.

Да, вызов другого метода вместо super и использование частичного макета - правильное решение. EasyMock не может высмеивать super.

Тогда, если вы хотите смоделировать метод, вызываемый конструктором, это действительно невозможно. EasyMock не предоставляет способ издеваться перед имитацией.

В обоих случаях изменение дизайна, вероятно, улучшит дизайн.

...