如何使用PowerMock测试从同一类调用另一个私有void方法的方法



我有一个类,它有一些方法,就像在例子中。

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通常用于控制从方法返回的内容;这里,你基本上是说这个方法必须被调用,但你想覆盖它的实现什么(如果我理解正确的话)。我不确定我能想到一个在测试类中有用或必要的情况。您提供的示例过于一般化,无法理解其背后的推理,但是您应该尝试看看是否有更好的方法来实现您的目标。

相关内容

  • 没有找到相关文章

最新更新