Закрытый вызов метода с использованием Powermock - PullRequest
0 голосов
/ 04 октября 2018

Я не могу получить данные, которые я установил для смоделированного объекта, используя вызов метода, т.е. invokeMethod.Я могу получить его, используя getInternalState.

controller_mock = mock(MyController.class);

ArrayList<BaseItem> items = new ArrayList<>();

final ItemTypeOne item1 = new ItemTypeOne();
final ItemTypeOne item2 = new ItemTypeOne();
final ItemTypeTwo item3 = new ItemTypeTwo();
final ItemTypeTwo item4 = new ItemTypeTwo();

items.add(item1);
items.add(item2);
items.add(item3);
items.add(item4);

Whitebox.setInternalState(controller_mock, "mItems", items);

System.out.println(controller_mock);
//Prints -> myController
System.out.println(Whitebox.getInternalState(controller_mock, "mItems"));
//Prints -> [UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN]
System.out.println(Whitebox.invokeMethod(controller_mock, "getItems"));
//Prints -> []
System.out.println(controller_mock.getItems());
//Prints -> []

getItems () в MyController

public List<BaseItem> getItems() {
    return mItems;
}

1 Ответ

0 голосов
/ 07 октября 2018

Вам нужно сделать выбор между:

  • методом имитации Whitebox.invokeMethod(controller_mock, "getItems");
  • получателем реального экземпляра controller_mock.getItems();

Whitebox # invokeMethod

Из документа Whitebox#invokeMethod:

Вызвать метод частного или внутреннего класса.Это может быть полезно для тестирования закрытых методов.

Работает только в том случае, если private:

private List<BaseItem> getItems() {
    return mItems;
}

В этом случае вам разрешено вызывать метод получения только в тестовом классе, так какprivate.

controller_mock.getItems ()

Насмешка означает создание объектов, которые имитируют поведение реальных объектов.Поскольку controller_mock улучшен с помощью mockito, если вы хотите вызвать метод реального экземпляра, вам нужно установить его явно:

when(controller_mock.getItems()).thenCallRealMethod();
System.out.println(controller_mock.getItems());
...