如何模拟一个类,其对象在另一个类的类级别创建

时间:2016-09-27 05:51:05

标签: java unit-testing powermock

例如,我有一个这样的类:

class Ex1{
    Ex2 e = new Ex2();
    Ex1(){
        System.out.println("COnstructor of Ex1");
    }
    public int m1(){
       int i = e.test();
       return i;
    }
 }

 class Ex2{
     Ex2(){
         //some code here, I dont want to execute this code
      }
     public int test(){
         return 5;
     }
 }

我正在为Ex1 class编写测试类,在这里我必须mock Ex2 class

测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Ex1.class,Ex2.class})
class Ex1Test{

private static Ex1 ex;
private static Ex2 e;
@BeforeClass
public static void start(){
    e = mock(Ex2.class);
    PowerMock.whenNew(Ex2.class).withNoArguments().thenReturn(e);
    ex1 = new Ex1();
}

但它不是嘲弄Ex2 class对象,而是直接创建......

1 个答案:

答案 0 :(得分:1)

您的问题是您创建了难以测试代码。

是的,可以使用Powermock来解决问题"那个问题。但问题是:您仍然创建了紧密耦合,难以测试的生产代码。简单的答案是:当你必须控制"您的对象,您可以直接在生产代码中调用 new

有两种方法可以防止这种情况:

  1. 您使用依赖注入来提供此类对象到您的生产代码
  2. 您使用依赖注入为您的生产代码提供工厂
  3. 当你这样做时,你不再需要Powermock了。

    长话短说:在添加对Powermock的依赖之前;观看那些videos,并考虑如果不使用Powermock可能是更好的选择。