猿问

使用 Powermock 调用私有方法

我无法使用方法调用 ie 获取我设置为模拟对象的数据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;

}


撒科打诨
浏览 442回答 1
1回答

慕哥6287543

您需要在以下选项中做出选择:模拟方法&nbsp;Whitebox.invokeMethod(controller_mock, "getItems");真实实例的getter&nbsp;controller_mock.getItems();白盒#invokeMethod从文档Whitebox#invokeMethod:调用私有或内部类方法。这对于测试私有方法可能很有用。只有在私有时才有效:private List<BaseItem> getItems() {&nbsp; &nbsp; return mItems;}在这种情况下,您只能在测试类中调用 getter,因为它是私有的。controller_mock.getItems()模拟意味着创建模拟真实对象行为的对象。由于controller_mock是mockito增强的,如果要调用真实实例的方法,需要显式设置:when(controller_mock.getItems()).thenCallRealMethod();System.out.println(controller_mock.getItems());
随时随地看视频慕课网APP

相关分类

Java
我要回答