【问题标题】:Spring integration testing a controller with dependency injectionSpring集成使用依赖注入测试控制器
【发布时间】: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


    【解决方案1】:

    如果你想要自动装配依赖,你不能像这样创建你的控制器:

    controller = new AuthenticationController();
    

    你可以将你的依赖自动装配到你的测试中

    @Autowired
    private UserManagement um;
    

    并在您的控制器中创建构造函数以执行此操作:

    @Before
    public void setUp() {
       controller = new AuthenticationController(um);
    }
    

    但我建议使用 MockServletContext。

    MockServletContext mockServletContext = new MockServletContext();
    mockServletContext.addInitParameter("contextConfigLocation", "path to your xml config"));
    ContextLoaderListener listener = new ContextLoaderListener();
    listener.initWebApplicationContext(mockServletContext);
    

    还应该在某处引用 DispatcherServlet。我从来没有在 servlet environmentm 中这样做过,只在 spring portlet mvc 中这样做过,但它应该是相似的。这个想法是创建虚假的 Web 应用程序上下文并调用调度程序 servlet 以在您的控制器和 spring 配置之间进行完整的集成测试。

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多