使用Mockito或PowerMocktio在SUT的方法中模拟本地对象



我有下面这样的类方法,它创建一个本地对象并在该本地对象上调用一个方法。

public class MyClass {
    public someReturn myMethod(){
        MyOtherClass otherClassObject = new MyOtherClass();
        boolean retBool = otherClassObject.otherClassMethod();
        if(retBool){
            // do something
        }
    }
}
public class MyClassTest {
    @Test
    public testMyMethod(){
        MyClass myClassObj = new MyClass();
        myClassObj.myMethod();
        // please get me here.. 
    }
}

当我测试myMethod时,我想模拟otherClassObject.otherClassMethod以返回我选择的内容。otherClassMethod对消息队列做了一些类,我不希望在单元测试中这样做。所以我想在执行otherClassObj.otherClassMethod()时返回true。我知道在这种情况下,我一定使用了MyOtherClass实例化的工厂,但这是遗留代码,我现在不想更改任何代码。我看到Mockito在这种情况下没有提供这种功能来模拟MyOtherClass,但可以使用PowerMockito。然而,我找不到上面场景的例子,只找到了静态类的例子。我应该如何模拟SUT方法中的局部对象?

我还提到了一些其他的操作系统问题,比如用Mockito模拟本地范围对象的方法,但它们没有帮助。

一个代码示例将有很大帮助。

如果您使用PowerMockito,您可以使用whenNew方法

它应该看起来像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)  //tells powerMock we will modify MyClass to intercept calls to new somewhere inside it
public class MyClassTest{
    @Test
    public void test(){
          MyOtherClass myMock = createMock(MyOtherClass.class);
          //this will intercept calls to "new MyOtherClass()" in MyClass
          whenNew( MyOtherClass.class).withNoArguments().thenReturn( myMock) );
          ... rest of test goes here
   }

另外,另一篇SO文章也有PowerMockito Mocking when New不影响的示例代码

好吧,这不是一个真正的答案,但有了PowerMockito,你可以做到这一点:

final MyOtherClass myOtherClass = mock(MyOtherClass.class);
// mock the results of myOtherClass.otherClassMethod();
PowerMockito.whenNew(MyOtherClass.class).withNoArguments()
    .thenReturn(myOtherClass);
// continue with your mock here

现在,不确定你是否真的需要这个其他ClassMethod的结果,但如果你不需要,我建议你模拟myMethod()的结果——除非myMethod()是你想要测试的,因为这个其他方法对它有影响,是的,在这种情况下,应该考虑重构。。。并没有延迟生命永恒。。。

相关内容

  • 没有找到相关文章

最新更新