簡體   English   中英

spring3注釋與main方法

[英]spring3 annotation with main method

我有以下課程:

@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(login)提供空指針異常。 怎么可以作為主要方法運行沒有錯誤?

當你“運行代碼作為junit test”來引導你的應用程序上下文和依賴注入時,你仍然需要做JUnit所做的事情:

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

main是另一回事。 因為通過new LoginDetailsTest()實例化它不是由Spring構建的 - 沒有依賴注入。

你需要做的是:

  • 為您的main方法創建一個新的應用程序上下文appctx.xml ,它導入Home-ctx.xml並聲明一個新bean <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測試,主方法和業務邏輯。

首先,你的測試工作的原因是(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

要解決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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM