Spring интеграция тестирования контроллера с внедрением зависимостей - PullRequest
4 голосов
/ 28 февраля 2012

Я пытаюсь написать интеграционный тест для одного из моих классов контроллеров, в которых есть введенная зависимость.Я пытаюсь проверить ту часть моего контроллера, где он вызывает метод через внедренный объект, но когда я запускаю свой тест, он терпит неудачу из-за исключения нулевого указателя.В тесте я использовал аннотации @ContexConfiguration и @RunsWith, но это не помогло.Некоторый код может помочь:)

AuthenticationController:

@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"

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", "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");
    }

Stacktrace сообщает мне, что ошибка возникает, когда тест вызывает метод входа в систему введенного объекта userMangaement.гм = ноль, поэтому инъекция не работает с тестом.Контроллер отлично работает при использовании.

Любой комментарий очень поможет!

Заранее спасибо,

Sorex

1 Ответ

4 голосов
/ 28 февраля 2012

Если вам нужны зависимости с автопроводами, вы не можете создать свой контроллер следующим образом:

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.Я никогда не делал этого в среде сервлетов, только в весеннем портлете MVC, но это должно быть похоже.Идея состоит в том, чтобы создать фальшивый контекст веб-приложения и вызвать сервлет диспетчера для полного тестирования интеграции между вашими контроллерами в весенней конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...