我有一个类,其中包含一些类似示例的方法。
public class TestClass {
public boolean aMethod()
{
voidMethod();
return true;
}
private void voidMethod()
{
... does something ...
}
... other methods ...
}
我想用powermock测试aMethod
,除了voidMethod
之外,所有方法都应该正常工作。
我已经创建了TestClass
的部分模拟,以使voidMethod
什么都不做。但我不知道如何期待这种方法的调用。
testObject = createPartialMock(TestClass.class, "voidMethod");
expectPrivate(testObject, "voidMethod");
我在第二行收到错误:
EasyMock类型中的expect(T)方法不适用于参数(void)
如何解决此问题?
答案 0 :(得分:2)
使用这样的简单调用:
testObject.voidMethod(); // don't use "expect" for voids
expectLastCall().times(3); // use this for expectations
在运行经过测试的代码之后,不要忘记reply()
以及verify()
。
答案 1 :(得分:2)
看起来PowerMock无法模拟私有void方法(只返回返回值的私有方法)。它们应该真正提供更有用的编译器错误来明确说明。 EasyMock根本不会模拟私有方法。 @StanislawLeventhal的答案引用了使用EasyMock预期(记录)对非私有void方法的调用的语法。
你应该先做的是考虑你要做的事情是否有意义,以及真正需要嘲笑的是什么。当你嘲笑私有方法时,请考虑它的代码味道;也许你需要这样做,但通常,有一种方法可以避免它。批判性地思考你为什么嘲笑这一点听起来很明显,但很容易让人感到困惑和错过。
为什么你的测试类中有一个私有方法,你不能直接调用,而是需要模拟,但是它不返回值?模拟通常用于控制从方法返回的内容;在这里,你基本上是说必须调用这个方法,但是你想要什么都不覆盖它的实现(如果我理解的话)。我不确定我能想到这在测试类中有用或必要的情况。您提供的示例过于笼统,无法理解背后的原因,但您应该尝试查看是否有更好的方法来实现目标。