我们可以使用powermock模拟第二对象创建吗

时间:2018-07-24 10:46:24

标签: java powermock

我们可以使用以下行使用powermock模拟对象创建:

MyClass myObj = getMyObj();

PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(myObj);

现在在我正在编写测试用例的班级中,我有这种逻辑:

public class TestClass {

   public void testMethod() {
      MyClass obj = new MyClass();
      boolean flag = doSomeOperation();
      if(flag) {
        MyClass obj1 = new MyClass();
        //doSomeOtherOp();       
      }
   }
}

这里我要模拟第二个对象创建obj1,是否可以使用powermock控制我要模拟的对象。在这里,我不想模拟第一个对象obj

1 个答案:

答案 0 :(得分:2)

我认为这很简单:

PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(firstResult)
  .thenReturn(anotherResult);

但是不幸的是,尽管在其他情况下也可以链接,但是PowerMockito似乎不允许这样做。

(类似

when(someMock.toString()).thenReturn("a").thenReturn("b");
System.out.println(someMock.toString() +factory.toString();

恰好打印ab! )

所以我现在唯一能给出的答案是:您编写了难以测试的代码。考虑不这样做。

与其依赖PowerMock模拟对new()的调用,您应该退后一步并更改设计。例如,通过在生产代码中使用工厂。因此,您无需直接调用new(),只需向工厂询问新实例即可。而且无需PowerMock(ito)即可轻松模拟该工厂。