EasyMock - как смоделировать инстанцирование и переменную частного объекта - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующий класс для проверки с созданием поддельных личных объектов,

    class TestClass {

    private Dialog dialog;

    private DialogChangeListener listener = new DialogChangeListener() {
        public void onChange(Event e) {
            String v = e.getValue();
            if (condition1) {
                // perform operation 1
            } else if (condition2) {
                // perform operation 2
            } else if (condition3) {
               // perform operation 3
            }
        }
    }

    public void openDialog() {
        if (condition1) {
            dialog = new Dialog(arg1, arg2, listener);
        } else if (condition2) {
            dialog = new Dialog(arg1, arg2, arg3, listener);
        } else if (condition3) {
            dialog = new Dialog(arg1, arg2, arg3, listener);
        }
    }
}

В приведенном выше сценарии, как смоделировать с помощью EasyMock частную переменную 'Dialog' и ее экземпляры вместе с закрытой переменной 'listener', чтобы остальные операции продолжались на условной основе.

1 Ответ

0 голосов
/ 14 мая 2018

В моем ответе три части.

Во-первых, вы не можете высмеивать атрибуты и создание экземпляров с помощью EasyMock. Эти случаи нужны редко и означают, что вам следует провести рефакторинг.

Во-вторых, PowerMock может издеваться над экземплярами. Это мощный, но я на самом деле никогда не использую его сам.

В-третьих, в вашем случае,

  1. Я бы добавил конструктор, принимающий слушателя в параметре. Чтобы легко издеваться
  2. Выполните частичное макетирование и извлеките создание Диалога в определенный метод. Это если вам действительно нужно сохранить творение там. В противном случае я просто перенесу его на какой-нибудь завод и издевался бы над ним.

Пример кода:

public void openDialog() {
    if (condition1) {
        dialog = createDialog(listener, arg1, arg2);
    } else if (condition2) {
        dialog = createDialog(listener, arg1, arg2, arg3);
    } else if (condition3) {
        dialog = createDialog(listener, arg1, arg2, arg3);
    }
}

/* default scope to make it mockable */ Dialog createDialog(DialogChangeListener listener, Object... args) {
    //...
}

А потом тест:

TestClass testClass = EasyMock.partialMockBuilder(TestClass.class)
        .addMockedMethod("createDialog")
        .createMock();
expect(testClass.createDialog(listener, ...)).andReturn(someDialog);
...