spring3注释与main方法

时间:2011-09-14 20:00:49

标签: java spring junit

我有以下课程:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/com/home/app/Home-ctx.xml"})
public class LoginDetailsTest  {

    public static void main(String[] args) {
        new LoginDetailsTest().testLoginDetails();
    }
    @Inject
    @Named(HomeConstants.loginDetailsService)
    private LoginDetailsService loginDetailsService;
    private List<UserLogin> loginDetails;

    @Test
    public void testLoginDetails() {
        UserLogin login = new UserLogin();
        login.setLoginName("test");
        login.setLoginPassword("test123");
        loginDetails = loginDetailsService.loginDetails(login);
        for (UserLogin loginDet : loginDetails) {
            System.out.println(loginDet.getLoginName());
            System.out.println(loginDet.getLoginPassword());
        }
    }
}

如果我将代码作为junit test运行,那么它会给出预期的结果。 如果我作为Java应用程序运行,即main方法,那么它给出了空指针异常 的 loginDetailsS​​ervice .loginDetails(登录)。如何在没有错误的情况下作为主方法运行?

3 个答案:

答案 0 :(得分:5)

当你“运行代码作为junit test”来引导你的应用程序上下文和依赖注入时,你仍然需要做JUnit所做的事情:

public static void main(String[] args) {
    org.junit.runner.JUnitCore.run(LoginDetailsTest.class);
}

答案 1 :(得分:2)

main是另一回事。因为通过new LoginDetailsTest()实例化它不是由Spring构建的 - 所以不能有依赖注入。

您需要做的是:

  • 为导入appctx.xml并声明新bean main
  • Home-ctx.xml方法创建新的应用程序上下文<bean id="loginDetailsTest" class="LoginDetailsTest"/> 在您的main方法中
  • 获取bean的实例并像这样调用testLoginDetails()

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("appctx.xml");  
        LoginDetailsTest loginDetailsTest = (LoginDetailsTest) context.getBean("loginDetailsTest");
        loginDetailsTest.testLoginDetails();
    }
    

通常,您应该将JUnit测试,主方法和业务逻辑分开。

答案 2 :(得分:1)

首先,你的测试工作的原因是(SpringJUnit4ClassRunner),它做了很多但是为了保持简单,它启动了弹簧容器并注入了你在上下文文件中定义的所有依赖项(Home-ctx.xml) )包括你注入测试用例的那个。有关更多详细信息,请查看这些类

  1. http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/context/TestContextManager.html
  2. http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/context/support/DependencyInjectionTestExecutionListener.html
  3. 要解决main方法的问题,你必须加载你自己的spring上下文并注入一些像这样的依赖

     ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/com/home/app/Home-ctx.xml");
    
     new LoginDetailsTest().loginDetailsService = (LoginDetailsService) ctx.getBean(LoginDetailsService.class); 
    
     //now your main method should work
     new LoginDetailsTest().testLoginDetails();