Spring测试/生产应用程序上下文

时间:2014-04-26 17:26:19

标签: java spring

为什么在使用@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());
    }
}

感谢。

2 个答案:

答案 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并检索它。如果您的配置正确,它将自动装配。