Spring 3.0 junit тестовый DispatcherServlet диспетчеризации

#spring #junit4 #dispatcher #spring-3

#весна #junit4 #диспетчер #spring-3

Вопрос:

Я пытаюсь протестировать свое приложение с помощью junit.

Поэтому я настроил следующий класс:

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/META-INF/spring/applicationContext-test.xml" )
@TransactionConfiguration
@Transactional
public class DispatcherServletTest extends AbstractJUnit4SpringContextTests {

    private MockHttpServletRequest request;
    private MockHttpServletResponse response;

    private DispatcherServlet dispatcher;

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

            MockServletConfig config = new MockServletConfig("myapp");
            config.addInitParameter("contextConfigLocation","classpath*:webmvc-config.xml");

            dispatcher = new DispatcherServlet();
            dispatcher.init(config);
    }
    //test cases
  

}

Итак, проблема в том, что, похоже, мой диспетчерский сервлет не может отправить какой-либо запрос ни на один из моих контроллеров.

Я думаю, что есть что-то с конфигурацией — contextConfigurationLocation. Похоже, что он может найти файл (в противном случае это вызвало бы исключение), но не загружает никакой конфигурации

Регистратор сообщает:

org.springframework.web.servlet.PageNotFound — не найдено сопоставления для HTTP-запроса с URI [http://localhost:8080/myapp/abc ]

Но я абсолютно понятия не имею, что не так…

Я был бы признателен за любую помощь!

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

Комментарии:

1. Вы действительно хотите протестировать диспетчерский сервлет, почему бы не протестировать «только» методы обработчика веб-контроллера?

2. я думаю, что мы не можем протестировать http-запрос с помощью junit. только служба.

3. Нет, я бы действительно протестировал все приложение, имея в виду, вызывается ли правильный метод контроллера. Например: я отправляю СООБЩЕНИЕ в / myposturl с некоторыми данными на серверную часть и хочу проверить, «отвечает» ли правильный контроллер с методом, ответственным за этот вызов, поэтому я подумал, что я должен отправить запрос сервлету диспетчера, а не контроллеру напрямую. В моем контроллере у меня просто есть метод, обрабатывающий этот запрос: RequestMapping(метод = RequestMethod. СООБЩЕНИЕ, заголовки = «Принять =…») общедоступный объект ответа<Строка> createFromJsonArray(@RequestBody String json) {…

Ответ №1:

Мины работают нормально, попробуйте следующие настройки.

  1. если вы используете Junit4, нет необходимости расширять свой тестовый класс, бегун junit должен выполнить это задание
  2. Загрузите конфигурацию контекста через classpath и убедитесь, что она доступна из тестового classpath

    @ContextConfiguration(местоположения={«classpath:applicationContext-test.xml «})

  3. затем просто протестируйте аннотированные контроллеры. Я делаю это так:

 @Test
 @Транзакционный 
 public void testAnnotatedListUser() выдает исключение {
 Макет запроса HttpServletRequest = новый макет запроса HttpServletRequest();
 Макет ответа HttpServletResponse = новый макет ответа HttpServletResponse();
 Annotationmethod HandlerAdapter handlerAdpt = новый annotationmethod HandlerAdapter();
 запрос.setRequestURI("/you/URIhere");
 ModelAndView mav = handlerAdpt.handle(запрос, ответ, this.controller);
 assertEquals("Возвращено неверное имя представления", "myexpectedviewname", mav.getViewName()); 
 }

Ответ №2:

В моем вопросе есть несколько проблем:

Во-первых, невозможно расширить AbstractJUnit4SpringContextTests и использовать @RunWith(…), потому что это одно и то же.

Во-вторых, вы должны использовать не dispatcherServlert, а обработчик, определив обработчик в вас application.xml и автоматическое включение его в тестовый пример через @Autowire частный обработчик обработчика…

Тогда все должно работать нормально!