Как к модульному тесту Spring контроллер MVC с помощью @PathVariable?

Можно использовать M-y после C-y для вставки предыдущего объекта от кольца уничтожения или использования пакет browse-kill-ring .

Что касается второго вопроса, см. DeleteSelectionMode.

52
задан Sam Brannen 9 September 2015 в 03:56
поделиться

4 ответа

Сообщение об исключении относится к переменной "подачи" , которого нет в вашем примере кода, скорее всего, это вызвано тем, что вы нам не показали.

Кроме того, ваш тест тестирует Spring и ваш собственный код. Это действительно то, что вы хотите сделать?

Лучше предположить, что Spring работает (что он и делает), и просто протестировать свой собственный класс, то есть напрямую вызвать MyController.doSomething () . Который'

3
ответ дан 7 November 2019 в 09:19
поделиться

Я бы назвал то, что вам нужно, интеграционным тестом, основываясь на терминологии справочного руководства Spring. Как насчет того, чтобы сделать что-то вроде:

import static org.springframework.test.web.ModelAndViewAssert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({/* include live config here
    e.g. "file:web/WEB-INF/application-context.xml",
    "file:web/WEB-INF/dispatcher-servlet.xml" */})
public class MyControllerIntegrationTest {

    @Inject
    private ApplicationContext applicationContext;

    private MockHttpServletRequest request;
    private MockHttpServletResponse response;
    private HandlerAdapter handlerAdapter;
    private MyController controller;

    @Before
    public void setUp() {
       request = new MockHttpServletRequest();
       response = new MockHttpServletResponse();
       handlerAdapter = applicationContext.getBean(HandlerAdapter.class);
       // I could get the controller from the context here
       controller = new MyController();
    }

    @Test
    public void testDoSomething() throws Exception {
       request.setRequestURI("/test.html");
       final ModelAndView mav = handlerAdapter.handle(request, response, 
           controller);
       assertViewName(mav, "view");
       // assert something
    }
}

Для получения дополнительной информации я написал запись в блоге об интеграционном тестировании аннотаций Spring MVC.

46
ответ дан 7 November 2019 в 09:19
поделиться

Я обнаружил, что вы можете вручную вставить отображение PathVariable в объект запроса. Это явно не идеально, но, похоже, работает. В вашем примере что-то вроде:

@Test
public void test() {
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.setRequestURI("/test.html");
    HashMap<String, String> pathvars = new HashMap<String, String>();
    pathvars.put("id", "test");
    request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathvars);
    new AnnotationMethodHandlerAdapter().handle(request, new MockHttpServletResponse(), new MyController());
   // assert something
}

Мне определенно было бы интересно найти лучший вариант.

2
ответ дан 7 November 2019 в 09:19
поделиться

Я не уверен, что мой исходный ответ поможет с @PathVariable. Я только что попытался протестировать @PathVariable и получил следующее исключение:

org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: не удалось вызвать метод обработчика [public org.springframework.web.servlet.ModelAndView test .MyClass.myMethod (test.SomeType)]; вложенное исключение - java.lang.IllegalStateException: не удалось найти @PathVariable [имя параметра] в @RequestMapping

Причина в том, что переменные пути в запросе анализируются перехватчиком. Для меня работает следующий подход:

import static org.springframework.test.web.ModelAndViewAssert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:web/WEB-INF/application-context.xml",
        "file:web/WEB-INF/dispatcher-servlet.xml"})    
public class MyControllerIntegrationTest {

    @Inject
    private ApplicationContext applicationContext;

    private MockHttpServletRequest request;
    private MockHttpServletResponse response;
    private HandlerAdapter handlerAdapter;

    @Before
    public void setUp() throws Exception {
        this.request = new MockHttpServletRequest();
        this.response = new MockHttpServletResponse();

        this.handlerAdapter = applicationContext.getBean(HandlerAdapter.class);
    }

    ModelAndView handle(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        final HandlerMapping handlerMapping = applicationContext.getBean(HandlerMapping.class);
        final HandlerExecutionChain handler = handlerMapping.getHandler(request);
        assertNotNull("No handler found for request, check you request mapping", handler);

        final Object controller = handler.getHandler();
        // if you want to override any injected attributes do it here

        final HandlerInterceptor[] interceptors =
            handlerMapping.getHandler(request).getInterceptors();
        for (HandlerInterceptor interceptor : interceptors) {
            final boolean carryOn = interceptor.preHandle(request, response, controller);
            if (!carryOn) {
                return null;
            }
        }

        final ModelAndView mav = handlerAdapter.handle(request, response, controller);
        return mav;
    }

    @Test
    public void testDoSomething() throws Exception {
        request.setRequestURI("/test.html");
        request.setMethod("GET");
        final ModelAndView mav = handle(request, response);
        assertViewName(mav, "view");
        // assert something else
    }

Я добавил в блог интеграцию, тестирующую аннотации Spring mvc

1
ответ дан 7 November 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: