4

주입 된 종속성이있는 컨트롤러 클래스 중 하나에 대한 통합 테스트를 작성하려고합니다. 내가 주입 된 개체를 통해 메서드를 호출하는 내 컨트롤러의 일부를 테스트하려고하지만 null 포인터 예외로 인해 내 테스트가 실패 할 때 실행합니다. 테스트에서 @ContextConfiguration과 @RunsWith 주석을 사용했지만 도움이되지 않았습니다. 일부 코드가 도움이 될 수 :스프링 통합 테스트 의존성 주입 컨트롤러

AuthenticationController :

시험의 context.xml에서
@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"; 
     } 
    } 

: beans:bean id="userManagement" class="my.packages.UserManagement"

AuthenticationControllerTest :

@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", "[email protected]"); 
     request.setParameter("pwd", "test"); 
     final ModelAndView mav = new AnnotationMethodHandlerAdapter() 
       .handle(request, response, controller); 
     final UserForm u = 
       assertAndReturnModelAttributeOfType(mav, "user", UserForm.class); 
     assertEquals("[email protected]", 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 객체의 login 메소드를 호출합니다. um = null이므로 주입이 테스트와 함께 작동하지 않습니다. 컨트롤러가 잘 작동합니다.

모든 의견이 도움이 될 것입니다. 사전에

감사합니다,

뒤쥐

답변

4

당신은 당신이 이런 식으로 컨트롤러를 만들 수 없습니다 자동으로 묶어 종속성을 원하는 경우 :

controller = new AuthenticationController(); 

당신은 당신이 당신의 시험에 의존성 autowire하기 수

@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을 참조해야합니다. Spring portlet MVC에서만 서블릿 환경에서이 작업을 수행 한 적이 없지만 유사합니다. 아이디어는 가짜 웹 애플리케이션 컨텍스트를 작성하고 dispacher 서블릿을 호출하여 컨트롤러 간의 완전한 통합 테스트를 봄 구성으로 수행하는 것입니다.