【发布时间】:2015-04-21 15:04:56
【问题描述】:
我确信这是一个很常见的问题,但我真的无法摆脱我在模拟私有方法时遇到的这个问题,该方法在内部调用另一个方法并返回一个集合。 我正在测试的类有一个公共方法,它调用私有方法来获取 Collection 对象。我使用 PowerMock 来创建一个私有方法的间谍。
public void method1(String s)
{
Collection<Object> list = invokePrivate()
}
private Collection<Object> invokePrivate()
{
Wrapper wrapperObj = Factory.getInstance.getWrapper();
Collection<Object> list = wrapperObj.callWrapperMethod(); // This always calls into real method, instead of mocked version.
return list;
}
测试类-:
所以为了测试公共方法“method1”,我使用 PowerMockito 创建了一个间谍来监视私有方法并返回一个演示列表。
MainClass obj = new MainClass();
MainClass spy = PowerMockito.spy(obj);
PowerMockito.when(spy, method(MainClass.class, "inokePrivate"))
.thenReturn(list); // demo list which exists as a test class member.
上面调用私有方法,该方法又尝试调用驻留在不同工件中的 wrapperObj.callWrapperMethod() 并在那里中断,因为它在那里找不到某些实现。 所以我尝试模拟 wrapperObj.callWrapperMethod。
WrapperClass wr = new WrapperClass();
WrapperClass spy1 = PowerMockito.spy(wr);
when(spy1.callWrapperMethod()).thenReturn(list) // demo list which exists as a test class member.
再次模拟调用 callWrapperMethod() 的实际实现并在那里中断。 如何防止调用包装器方法的实际实现?
一些对我有帮助的答案-:
Mockito:How to mock method called inside another method
Testing Private method using mockito
[更新] -:正如我所做的建议那样 - :
PowerMockito.doReturn(list).when(spy1).callWrapperMethod(); // This returns me demo list successfully.
但是现在当我从 PowerMockito 调用私有方法时,控制进入 invokePrivate 方法并再次尝试调用原始 callWrapperMethod 而不是从间谍版本返回列表。
【问题讨论】:
-
感谢您的快速响应 ;-)
标签: java unit-testing junit mockito powermock