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

标签 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

最佳答案

我认为这很简单:

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) 即可轻松模拟该工厂。

关于java - 我们可以使用 powermock 模拟第二个对象创建吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51496671/

相关文章:

java - mongo java 条件和如果不为空

java - 模拟嵌套函数给出了 NPE

java - 使用 Powermock 时 Gradle Jacoco 不跟踪 Spock 测试的覆盖率

java - Android:如何使用JobService的JobFinished

java - 如果我的配额已过期,如何删除数据存储?

java - 最终类中的 Powermock 链式方法调用

java - 使用 Mockito 调用模拟方法时出现 NullPointerException

java - AnyString() 作为单元测试的参数

java - 我如何将java对象从服务器端传递到客户端

java - 无法创建池的初始连接,无法获取 JDBC 连接错误