我有一个类,它有一些方法,就像在例子中。
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)
如何解决这个问题?
使用这样的简单调用:
testObject.voidMethod(); // don't use "expect" for voids
expectLastCall().times(3); // use this for expectations
不要忘记在你所有的期望之后的reply()
和运行测试代码之后的verify()
。
看起来PowerMock不能模拟私有void方法(只能模拟带有返回值的私有方法)。它们应该提供一个更有用的编译器错误来明确地说明这一点。EasyMock根本不模拟私有方法。@StanislawLeventhal的回答引用了使用EasyMock期待(记录)对非私有void方法调用的语法。
你首先应该做的是考虑你想做的事情是否有意义,以及真正需要嘲笑的是什么。当你模拟私有方法时,把它看作是一种代码气味;也许你需要这样做,但通常,有一种方法可以避免。批判性地思考嘲笑的原因听起来很明显,但很容易混淆和错过一些事情。
为什么你应该在你的测试类中有一个私有方法,你不能直接调用,而是需要模拟,但它不返回值?mock通常用于控制从方法返回的内容;这里,你基本上是说这个方法必须被调用,但你想覆盖它的实现什么(如果我理解正确的话)。我不确定我能想到一个在测试类中有用或必要的情况。您提供的示例过于一般化,无法理解其背后的推理,但是您应该尝试看看是否有更好的方法来实现您的目标。