3

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

public class TestClass {

    public boolean aMethod()
    {
        voidMethod();
        return true;
    }

    private void voidMethod()
    {
        ... does something ...
    }

    ... other methods ...
}

我想aMethod用 powermock 进行测试,所有方法都应该正常工作,除了voidMethod. 我创建了一个不做任何事情的部分模拟TestClassvoidMethod但我不知道如何期望调用此方法。

testObject = createPartialMock(TestClass.class, "voidMethod");
expectPrivate(testObject, "voidMethod");

我在第二行收到错误:

EasyMock 类型中的方法 expect(T) 不适用于参数 (void)

我该如何解决这个问题?

4

2 回答 2

2

看起来 PowerMock 无法模拟私有 void 方法(只有返回值的私有方法)。他们确实应该提供一个更有用的编译器错误来明确说明这一点。EasyMock 根本不模拟私有方法。@StanislawLeventhal 的答案引用了使用 EasyMock 期望(记录)对非私有 void 方法的调用的语法。

您应该首先考虑您正在尝试做的事情是否有意义,以及真正需要嘲笑的事情。当您模拟私有方法时,将其视为代码气味;也许您需要这样做,但通常有一种方法可以避免它。批判性地思考为什么要嘲讽听起来很明显,但很容易混淆和错过一些事情。

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

于 2012-11-30T19:05:38.040 回答
2

像这样使用简单的调用:

testObject.voidMethod(); // don't use "expect" for voids
expectLastCall().times(3); // use this for expectations

并且不要忘记reply()在您的所有期望和verify()运行经过测试的代码之后。

于 2011-12-08T06:26:44.457 回答