2015-08-17 3 views
1

Я хотел бы проверить, что, когда запрашивается неизвестный URL-адрес, и возникает ошибка 404, которую мое веб-приложение действительно перенаправляет в нужное место.Тест весеннего блока 404 unknown url in mock mvc

Я не мог получить эту работу, я думаю, потому что tomcat обрабатывает ошибки 404, поэтому forwardedUrl всегда является нулевым для тестов. Я знаю, что это работает на самом деле, потому что, если я ввожу какой-то мусор в URL-адрес, мое приложение перенаправляется на мою пользовательскую страницу.

Мой блок тест выглядит следующим образом:

@Test 
public void testUnknownUrl() throws Exception { 
mockMvc.perform(get("/url_doesnt_exist")) 
    .andExpect(status().isNotFound())   
    .andExpect(forwardedUrl("/static/error/Sorry.html"));    
} 

Моя конфигурация web.xml является:

<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<error-page> 
    <error-code>404</error-code> 
    <location>/static/error/Sorry.html</location> 
</error-page> 

Отображение для/статики определяется в моем весеннем конфигурации, как:

<resources mapping="/static/**" location="/resources/" /> 

В конечном счете, я хотел бы высмеять запрос на неизвестный URL-адрес, а затем проверить, что возвращаемая страница/static/erro г/Sorry.html.

Я делаю что-то неправильно или это не способ обрабатывать 404 и т. Д. Весной? Проверка перенаправленного URL-адреса в модульном тесте всегда равна нулю.

Немного другой вопрос, но все-таки связанный с ним, в какой момент обработка ошибок tomcat вызывает вызов над диспетчером управления весенним контроллером?

+0

Не согласны ли вы использовать конфигурацию «Диспетчерский сервлет» Spring? Просто, чтобы быть уверенным ... –

+0

Нет. Я отредактирую свой вопрос. Спасибо – berimbolo

ответ

0

Я использую весну 3, и после некоторого чтения я обнаружил, что сервлет диспетчера просто возвращает код ответа, не бросая исключение, которое, как я думаю, является причиной того, что tomcat всегда обрабатывает это.

Удаление тегов страницы ошибки из web.xml приводит к общей странице 404 tomcat, поэтому я думаю, что ответ на этот вопрос заключается в обновлении до весны 4, где я могу передать параметр init параметру сервлет диспетчера, попросив его ошибка для страницы не найдена.

Я рад, что вас исправили, хотя это может помочь мне в понимании.

1

Я не уверен в конфигурации с помощью пути /static в вашем web.xml, это не должно быть так, в зависимости от вашей конфигурации dispatcher-servlet (по умолчанию); но насколько я могу судить, вы на правильном пути.

Это то, что у меня есть для меня:

@WebAppConfiguration 
@ActiveProfiles("development") 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = AppConfig.class) 
public class ErrorControllerTest { 
    @Autowired 
    private WebApplicationContext context; 
    private MockMvc mockMvc; 

    @Before 
    public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(context)/*.alwaysExpect(status().isOk())*/.build(); 
    } 

    @Test 
    public void testError() throws Exception { 
    mockMvc.perform(get("/error").contentType(MediaType.TEXT_HTML)) 
     .andExpect(status().isOk()) // See "alwaysExpect" above 
     .andExpect(view().name("error")) 
     .andExpect(forwardedUrl("/WEB-INF/views/error.jsp")); 
    } 

    @Test 
    public void testResourceNotFound() throws Exception { 
    mockMvc.perform(get("/resource-not-found").contentType(MediaType.TEXT_HTML)) 
     .andExpect(status().isNotFound()) 
     .andExpect(view().name("resource-not-found")) 
     .andExpect(forwardedUrl("/WEB-INF/views/resource-not-found.jsp")); 
    } 
} 

Пример проекта here. Я использую JSP, но вы можете переключиться на .html, просто изменив конфигурацию InternalResourceViewResolver.

+0

У меня нет контроллера, который справится с этим, должен быть какой-то контроллер весны под капотом, я думаю? /static/error/Sorry.html на самом деле является физическим файлом html внутри/webapp/resources. – berimbolo

+0

Но если у вас нет «контроллера», который обрабатывает этот «просмотр», то Spring MVC не сможет перейти к этому URL-адресу ... или я что-то упустил? Подождем «кавалерии». –

+0

Ну, я предположил, что это будет сервлет диспетчера в конечном счете, так как в web.xml он обрабатывает '/', поэтому я решил, что даже если tomcat перенаправляется на/static/error/Sorry.html что-то серверная сторона должна была обрабатывать это, и нет ничего другого, кроме определения сервлета диспетчера, поэтому я предположил, что в моем модульном тестировании перенаправленный URL-адрес будет заимствован из свойства location-страницы ошибки we.xml ... – berimbolo

Смежные вопросы