【发布时间】:2012-02-28 12:57:17
【问题描述】:
我正在尝试为其中一个具有注入依赖项的控制器类编写集成测试。我尝试测试控制器通过注入对象调用方法的部分,但是当我运行测试时,由于空指针异常而失败。在测试中,我使用了 @ContexConfiguration 和 @RunsWith 注释,但它没有帮助。 一些代码可能会有所帮助:)
身份验证控制器:
@Controller
public class AuthenticationController {
@Resource(name = "userManagement")
private UserManagement um;
@RequestMapping(method = RequestMethod.POST)
public String onSubmit(@ModelAttribute("user") UserForm user,
BindingResult result, Model model, HttpSession session) {
LoginFormValidator validator = new LoginFormValidator();
validator.validate(user, result);
if (result.hasErrors()) {
return "login";
} else {
User u = um.login(user.getEmail(), user.getPwd());
if (u != null) {
session.setAttribute("user", u);
LOGGER.info("succesful login with email: " + u.getEmail());
model.addAttribute("result", "succesful login");
} else {
model.addAttribute("result", "login failed");
}
return "result";
}
}
在 test-context.xml 中:
beans:bean id="userManagement" class="my.packages.UserManagement"
身份验证控制器测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"test-context.xml" })
public class AuthenticationControllerTest {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private AuthenticationController controller;
@Before
public void setUp() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
controller = new AuthenticationController();
}
@Test
public void testLoginPost() throws Exception {
request.setMethod("POST");
request.setRequestURI("/login");
request.setParameter("email", "test@email.com");
request.setParameter("pwd", "test");
final ModelAndView mav = new AnnotationMethodHandlerAdapter()
.handle(request, response, controller);
final UserForm u =
assertAndReturnModelAttributeOfType(mav, "user", UserForm.class);
assertEquals("test@email.com", u.getEmail());
assertEquals("test", u.getPwd());
assertViewName(mav, "result");
/* if UserForm is not valid */
final BindingResult errors = assertAndReturnModelAttributeOfType(mav,
"org.springframework.validation.BindingResult.user",
BindingResult.class);
assertTrue(errors.hasErrors());
assertViewName(mav, "login");
}
堆栈跟踪告诉我错误发生在测试调用注入的 userMangaement 对象的登录方法的地方。 um = null 因此注入不适用于测试。 控制器在使用中工作正常。
任何评论都会有很大帮助!
提前致谢,
索雷克斯
【问题讨论】:
标签: java spring dependency-injection inversion-of-control integration-testing