2011-12-08 84 views
3

我有一个类有这样的例子中的一些方法。如何用PowerMock测试一个从同一个类中调用另一个private void方法的方法?

public class TestClass { 

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

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

    ... other methods ... 
} 

我想测试aMethod与powermock和所有方法应该除了voidMethod正常工作。 我创建了一个TestClass的部分模拟,以使voidMethod什么都不做。但我不知道如何期待这种方法的调用。

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

我得到的第二行的错误:

在类型EasyMock的方法,期望(T)是不适用的参数(无效)

哪有我解决了这个问题?

回答

2

使用简单的调用是这样的:

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

并运行测试代码后,不要忘了你的期望后reply()verify()

+0

对不起,我有一个错误,但它不会改变behavior.voidMethod从aMethod调用,它是一个私人方法。任何我希望从aMethod.If调用voidMethod甚至voidMethod将公开,无论testObject.voidMethod();涉及到我的测试aMethod? – shift66

+0

由于voidMethod()是私有的,所以这个答案永远不会工作,它甚至不会编译。 –

2

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

你应该先做的是考虑你所做的事情是否合理,以及真正需要嘲笑的东西。当你嘲笑私有方法时,考虑它是一种代码味道;也许你需要这样做,但通常情况下,有一种方法可以避免它。批判性地思考你为什么在嘲笑,这听起来很明显,但很容易混淆和错过。

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

+0

如果这回答了这个问题,你会介意将它标记为答案吗? – hotshot309

+0

我最初提出了这个答案,但一天后,我重新审视了这个问题,我无法复制它。除了例外,什么shift66问似乎为我工作。 – Matt

相关问题