使用 Powermock 调用私有方法
Private method invocation using 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 -> []
getItems() 在 MyController
public List<BaseItem> getItems() {
return mItems;
}
您需要在以下两者之间做出选择:
- 模拟方法
Whitebox.invokeMethod(controller_mock, "getItems");
真实实例的- getter
controller_mock.getItems();
白盒#invokeMethod
来自 Whitebox#invokeMethod
的文档:
Invoke a private or inner class method. This might be useful to test
private methods.
仅在私有时有效:
private List<BaseItem> getItems() {
return mItems;
}
在这种情况下,您只能在测试 class 中调用 getter,因为它是私有的。
controller_mock.getItems()
模拟意味着创建模拟真实对象行为的对象。由于controller_mock
是mockito增强的,如果要调用真实实例的方法,需要显式设置:
when(controller_mock.getItems()).thenCallRealMethod();
System.out.println(controller_mock.getItems());
我无法使用方法调用(即 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;
}
您需要在以下两者之间做出选择:
- 模拟方法
Whitebox.invokeMethod(controller_mock, "getItems");
真实实例的 - getter
controller_mock.getItems();
白盒#invokeMethod
来自 Whitebox#invokeMethod
的文档:
Invoke a private or inner class method. This might be useful to test private methods.
仅在私有时有效:
private List<BaseItem> getItems() {
return mItems;
}
在这种情况下,您只能在测试 class 中调用 getter,因为它是私有的。
controller_mock.getItems()
模拟意味着创建模拟真实对象行为的对象。由于controller_mock
是mockito增强的,如果要调用真实实例的方法,需要显式设置:
when(controller_mock.getItems()).thenCallRealMethod();
System.out.println(controller_mock.getItems());