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

时间:2011-12-08 06:18:25

标签: java testing junit powermock

我有一个类,其中包含一些类似示例的方法。

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)

如何解决此问题?

2 个答案:

答案 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方法的调用的语法。

你应该先做的是考虑你要做的事情是否有意义,以及真正需要嘲笑的是什么。当你嘲笑私有方法时,请考虑它的代码味道;也许你需要这样做,但通常,有一种方法可以避免它。批判性地思考你为什么嘲笑这一点听起来很明显,但很容易让人感到困惑和错过。

为什么你的测试类中有一个私有方法,你不能直接调用,而是需要模拟,但是它不返回值?模拟通常用于控制从方法返回的内容;在这里,你基本上是说必须调用这个方法,但是你想要什么都不覆盖它的实现(如果我理解的话)。我不确定我能想到这在测试类中有用或必要的情况。您提供的示例过于笼统,无法理解背后的原因,但您应该尝试查看是否有更好的方法来实现目标。