使用Powermock进行私有方法调用

时间:2018-10-04 11:37:01

标签: java android unit-testing mockito powermock

我无法使用方法调用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 -> []

getControllers()在MyController中

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

1 个答案:

答案 0 :(得分:1)

您需要在以下选项之间进行选择:

  • 模拟方法WithStyles<typeof styles>
  • 获取真实实例Whitebox.invokeMethod(controller_mock, "getItems");

Whitebox#invokeMethod

摘自Whitebox#invokeMethod的文档:

  

调用私有或内部类方法。这可能对测试很有用   私有方法。

仅在私有时才有效:

controller_mock.getItems();

在这种情况下,由于它是私有的,因此只允许在测试类中调用getter。

controller_mock.getItems()

模拟意味着创建模拟真实对象行为的对象。由于private List<BaseItem> getItems() { return mItems; } 已由Mockito增强,因此,如果要调用实实例的方法,则需要显式设置它:

controller_mock