繁体   English   中英

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

[英]Mocking a local object inside a method of SUT using Mockito or PowerMocktio

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

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方法中模拟本地对象?

我还提到了其他一些OS问题,例如- 用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在新时不起作用模拟

好的,这不是一个真正的答案,但是使用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

现在,不知道你是否真的需要这样的结果otherClassMethod在这里,但如果你不这样做,我建议你嘲笑的结果myMethod()代替-除非myMethod()是要测试,因为这等什么方法对它有影响,是的,在这种情况下,应考虑重构...而不是延迟确定时间...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM