5

以下是我的课

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() 方法时,控件进入该方法并开始执行其中的每一行代码。我该如何防止这种情况发生?

4

3 回答 3

8

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

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

然后,当您在测试中使用此实例时,它将运行“testThisMethod”的原始版本和“helperMethodPublic”的覆盖版本

于 2012-05-25T16:46:08.337 回答
4

我认为这是因为杰夫所说的。

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

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

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

PowerMock.replayAll();
于 2012-07-05T18:41:06.807 回答
1

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

于 2012-05-25T16:50:07.403 回答