【问题标题】:Mocking a local object inside a method of SUT using Mockito or PowerMocktio使用 Mockito 或 PowerMocktio 在 SUT 方法中模拟本地对象
【发布时间】:2015-06-06 13:00:51
【问题描述】:

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

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

我还提到了一些其他操作系统问题,例如 - Mocking methods of local scope objects with Mockito,但它们没有帮助。

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

【问题讨论】:

  • 你可以使用反射来做到这一点。
  • 等一下;从您的示例代码中,您的otherClassObject 调用被完全忽略。您的示例代码是否不完整,或者您不能只是模拟myMethod 的结果?
  • @fge,我更新了我的代码和问题。
  • 你想从myMethod()这里测试什么?我真的不明白你在追求什么......
  • @fge myMethod 中的 retBool 之后有很多代码。我没有把所有的东西都放在这里。我的问题是 - 在这种情况下如何模拟 otherClassObject。

标签: java unit-testing mockito powermock powermockito


【解决方案1】:

如果您使用的是 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 whenNew Not taking affect

【讨论】:

  • 另一个 SO 帖子链接让一切变得清晰。谢谢!
【解决方案2】:

好的,这不是一个真正的答案,但使用 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()因为这个其他方法对其有影响,是的,在这种情况下应该考虑重构......而不是延迟ad vitam aeternam......

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2017-05-17
    • 2021-11-20
    相关资源
    最近更新 更多