模拟测试依赖注入的对象

时间:2012-11-28 22:03:26

标签: java spring testing dependency-injection mocking

我有四个类如下:

public class A(){

  public void getOne(){

    B objB = new B();
    String x = objB.getTwo();
  }
}



public class B(){

  public String getTwo(){

    C objC = new C();
    return objC.getThree();
  }
}


public class C(){

  D objD;

  public String getThree(){

    return objD.getFour();
  }
}

public class D(){

  public String getFour(){

    return "hi";
  }
}

在上面的代码中,类CobjD由Spring注入。当我尝试测试类getOne()的{​​{1}}方法时,我得到一个空指针异常,因为当方法调用到达类A时,它没有C实例化(因此例外)。我如何测试这样的方法,其中子子类有一个方法,该子子类是由Spring依赖注入的?

2 个答案:

答案 0 :(得分:1)

测试失败了,这是一件好事,因为Spring没有办法将依赖项注入到它自己不创建的对象中。如果您正在执行new C(),Spring对此一无所知,并且永远不会在此C实例中注入objD

D应注入C,应注入B,应注入A.这样,您可以通过注入模拟B来测试A;您可以通过注入模拟C来测试B,并且可以通过注入模拟D来测试C.

答案 1 :(得分:0)

虽然对象C可能是Spring注入的,但您没有在B(因此A)中意识到它,因为您正在使用new运算符来实例化{{ 1}},如果没有其他库的帮助,Spring不会拦截它(我假设你没有使用它)。

对于控制反转,

C是一个肮脏的词,我在newA都看到了它。

理想情况下,当您为B编写测试时,您不希望依赖于它不知道的任何内容(在本例中为AC)。您可能想要模拟/存根D的实例并将其注入B。对于A,我建议对B执行相同的操作。