为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Powermock 调用私有方法

使用 Powermock 调用私有方法

撒科打诨 2021-10-27 19:19:13
我无法使用方法调用 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 -> myControllerSystem.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 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您需要在以下选项中做出选择:

  • 模拟方法 Whitebox.invokeMethod(controller_mock, "getItems");

  • 真实实例的getter controller_mock.getItems();

白盒#invokeMethod

从文档Whitebox#invokeMethod

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

只有在私有时才有效:

private List<BaseItem> getItems() {

    return mItems;

}

在这种情况下,您只能在测试类中调用 getter,因为它是私有的。


controller_mock.getItems()

模拟意味着创建模拟真实对象行为的对象。由于controller_mock是mockito增强的,如果要调用真实实例的方法,需要显式设置:


when(controller_mock.getItems()).thenCallRealMethod();

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


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 441 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信