我有以下课程:
@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方法,那么它给出了空指针异常 的 loginDetailsService .loginDetails(登录)。如何在没有错误的情况下作为主方法运行?
答案 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) )包括你注入测试用例的那个。有关更多详细信息,请查看这些类
要解决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();