如何使用PowerMock部分模拟公共方法?

时间:2012-05-25 16:32:19

标签: java junit powermock partial-mocks

以下是我的班级

public class SomeClass {
    public ReturnType1 testThisMethod(Type1 param1, Type2 param2) {
        //some code
        helperMethodPublic(param1,param2);
        //more code follows  
    }   

    public ReturnType2 helperMethodPublic(Type1 param1, Type2 param2) {
        //some code            
    }
} 

所以在上面的类中测试testThisMethod()时,我想部分模拟helperMethodPublic()。

截至目前,我正在做以下事情:

SomeClass someClassMock = 
    PowerMock.createPartialMock(SomeClass.class,"helperMethodPublic");
PowerMock.expectPrivate(someClassMock, "helperMethodPublic, param1, param2).
    andReturn(returnObject);

编译器没有抱怨。所以我尝试运行我的测试,当代码命中helperMethodPublic()方法时,控件进入方法并开始执行那里的每一行代码。我该如何防止这种情况发生?

3 个答案:

答案 0 :(得分:8)

另一个不依赖于模拟框架的解决方案是覆盖测试中定义的匿名子类中的'helperMethodPublic':

SomeClass sc = new SomeClass() {
   @Override
   public ReturnType2 helperMethodPublic(Type1 p1, Type2 p2) {
      return returnObject;
   }
};

然后当你在测试中使用这个实例时,它将运行'testThisMethod'的原始版本和'helperMethodPublic'的重写版本

答案 1 :(得分:4)

我认为这是因为Jeff所说的。

试试这个 - 设置一个期望就像任何其他模拟方法一样:

SomeClass someClassMock = PowerMock.createPartialMock(SomeClass.class,
                                                      "helperMethodPublic");

EasyMock.expect(someClassMock.helperMethodPublic(param1, param2)).
    andReturn(returnObject);

PowerMock.replayAll();

答案 2 :(得分:1)

我猜这是因为你的“helperMethodPublic”不是私有方法(如PowerMock.expectPrivate中所示)。 PowerMock是一个扩展其他模拟框架的框架,用于添加诸如模拟私有和静态方法(JMock,Mockito等不处理)之类的东西。对公共方法进行部分模拟应该是底层模拟框架处理的东西。