繁体   English   中英

使用PowerMockito模拟构造函数不起作用

[英]Mocking constructor using PowerMockito doesn't work

我想测试一种使用其参数化构造函数创建另一个类的对象的方法。 即使我嘲笑MyClass的构造函数,它也会使第三方库处于构造函数实现中并导致错误。 我正在使用Mockito / PowerMockito。

public class MyClass{

   private MyObj obj;

   MyClass (String profile)
   {
      //some 3rd party library call
      obj = thridPartyLib.someMethod(profile);       
   }

   public String someMethod(){
     return obj.someExternalCall();
   }

}

我要测试的课程

public class ClassTobeTested{

   public void execute(){
       //some code
       // ......
       MyClass myClass = new MyClass(profile);
       myclass.someMethod();
   }
}

到目前为止,我一直在尝试classUnderTest.execute()最终调用thridPartyLib.someMethod(profile); 这是MyClass构造函数的一部分。

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(MyClass.class)
 public class ClassTobeTestedTest {

     private MyClass mockMyClass;
     private ClassTobeTested classUnderTest;


    @Before
    public void init() {    
       classUnderTest = new ClassTobeTested();
       mockMyClass = PowerMockito.mock(MyClass.class);  
    }

   @Test
   public void testExecute(){

      PowerMockito.whenNew(MyClass.class)
                 .withArguments(Mockito.any())
                 .thenReturn(mockMyClass);

      classUnderTest.execute();     
  }
}

您的代码仅在使用classUnderTest的间谍程序或模拟程序时才有效。 尝试这个。 这应该工作

@RunWith(PowerMockRunner.class)
@PrepareForTest( {MyClass.class, ClassTobeTested.class })
public class ClassTobeTestedTest {

  private MyClass mockMyClass;
  private ClassTobeTested classUnderTest;


  @Before
  public void init() {
    classUnderTest = spy(new ClassTobeTested());
    mockMyClass = PowerMockito.mock(MyClass.class);
  }

  @Test
  public void testExecute() throws Exception {

    PowerMockito.whenNew(MyClass.class)
        .withArguments(Mockito.any())
        .thenReturn(mockMyClass);

    classUnderTest.execute();
  }
}

痛苦可能暗示了另一种方法。 考虑将Factory注入到ClassTobeTestedClassTobeTested知道如何创建MyObj的实例。 例如:

class MyObjFactory {
   MyObj create(String profile) {
       return new MyClass(profile);
  }
}

然后

public class ClassTobeTested {
    private final MyObjFactory factory;

    public  ClassTobeTested(MyObjFactory factory) {
        this.factory = factory;
    }

   public void execute(){
       //some code
       // ......
      // MyClass myClass = new MyClass(profile);
      MyClass myClass = factory.create(profile);
      myclass.someMethod();
   }
}

因此,单元测试变得更加简单,只需要模拟Factory并使其返回模拟的MyClass实例即可。 然后,很容易验证myclass.someMethod()是否按预期被调用。

暂无
暂无

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

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