#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:
Мины работают нормально, попробуйте следующие настройки.
- если вы используете Junit4, нет необходимости расширять свой тестовый класс, бегун junit должен выполнить это задание
-
Загрузите конфигурацию контекста через classpath и убедитесь, что она доступна из тестового classpath
@ContextConfiguration(местоположения={«classpath:applicationContext-test.xml «})
-
затем просто протестируйте аннотированные контроллеры. Я делаю это так:
@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 частный обработчик обработчика…
Тогда все должно работать нормально!