我有四个类如下:
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";
}
}
在上面的代码中,类C
有objD
由Spring注入。当我尝试测试类getOne()
的{{1}}方法时,我得到一个空指针异常,因为当方法调用到达类A
时,它没有C
实例化(因此例外)。我如何测试这样的方法,其中子子类有一个方法,该子子类是由Spring依赖注入的?
答案 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
是一个肮脏的词,我在new
和A
都看到了它。
理想情况下,当您为B
编写测试时,您不希望依赖于它不知道的任何内容(在本例中为A
和C
)。您可能想要模拟/存根D
的实例并将其注入B
。对于A
,我建议对B
执行相同的操作。