为什么在使用@ContextConfiguration(...)运行spring测试时@Autowired会自动运行,并且在运行Java应用程序时我会得到NullPointerException?
以下示例我得到NullPointerException:
public class FinalTest {
@Autowired
private App app;
public FinalTest() {
}
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
FinalTest finalTest = new FinalTest();
finalTest.getApp().getCar().print();
finalTest.getApp().getCar().getWheel().print();
}
}
以下示例有效:
public class FinalTest {
private App app;
public FinalTest() {
}
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
FinalTest finalTest = new FinalTest();
finalTest.setApp((App)context.getBean("app"));
finalTest.getApp().getCar().print();
finalTest.getApp().getCar().getWheel().print();
}
}
在测试中不需要执行context.getBean(),它只适用于@Autowired:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext-test.xml"})
public class AppTest{
@Autowired
private App app;
@Test
public void test(){
assertEquals("This is a SEAT_test car.", this.app.getCar().toString());
assertEquals("This is a 10_test wheel.", this.app.getCar().getWheel().toString());
}
}
感谢。
答案 0 :(得分:2)
无论何时使用@Autowired
,依赖项将被注入的类都需要由Spring管理。
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext-test.xml"})
由Spring管理。当注释不存在时,该类不由Spring管理,因此没有 执行依赖注入
答案 1 :(得分:0)
您希望Spring能够将bean注入其无法管理的实例中。
您手动创建对象
FinalTest finalTest = new FinalTest();
Spring只能将bean注入它管理的对象中。在这里,Spring与上面创建的对象无关。
在您的上下文中声明一个FinalTest
bean并检索它。如果您的配置正确,它将自动装配。