2014-08-12 3 views
3

Я пишу интеграционные тесты с использованием MockMvc, и мне интересно, есть ли способ загрузить сервлет-сопоставления из web.xml (что обычно не имеет значения).MockMvc WebAppConfiguration: Загрузка сопоставлений сервлета в web.xml

У меня есть пользовательский HandlerInteceptor, который соответствует запросу URI (от HttpServletRequest) к шаблону (с использованием AntPathMatcher).

В web.xml я определяю сервлетов, как это (с соответствующей подвижной context.xml):

<servlet-mapping> 
    <servlet-name>mobileServlet</servlet-name> 
    <url-pattern>/services/*</url-pattern> 
</servlet-mapping> 

Таким образом, когда контроллер определяет отображение как "/operation", запросы должны действительно быть сделаны, чтобы "/services/operation" , Мой пользовательский HandlerInterceptor соответствует запросам URI для шаблона, такого как "/**/services/{operationName}/**".

Мое приложение отлично работает на Tomcat. Однако в @ContextConfiguration я могу указать только файл mobile-context.xml, поскольку web.xml не является конфигурационным файлом Spring. Таким образом, MockMvc позволяет мне отправлять запросы только "/operation", а не "/services/operation", в результате чего мое HandlerInterceptor выдает исключение.

Есть ли способ заставить MockMvc регистрировать отображения сервлетов или любые умные способы обойти это? Заранее спасибо.

Edit: similar question здесь говорит, что мне нужно, это не возможно, но у меня нет разрешения на изменение исходного кода, так что я не могу изменить шаблон или HandlerInterceptor.

ответ

2

Невозможно загрузить отображение web.xml. Однако вы можете явно указать путь к контуру, путь сервлета и информацию о пути в запросе. См. Javadoc для этих методов в MockHttpServletRequestBuilder.

2

Я использую MockMvc и MockMvcHtmlUnitDriver для проверки потока навигации в своем приложении. Я встал вопрос о MockMvc не в состоянии загрузить свои ресурсы JavaScript, потому что мое отображение сервлета было

<url-pattern>/ui/*</url-pattern> 

Поскольку мои навигационные потоки были рядом должностей и получаю, я не мог просто установить defaultRequest на MockMvcBuilder. Я решить мою проблему, создав MockMvcConfigurer:

public class ServletPathConfigurer implements MockMvcConfigurer { 

private final String urlPattern; 
private final String replacement; 


public ServletPathConfigurer(String urlPattern, String replacement) { 
    super(); 
    this.urlPattern = urlPattern; 
    this.replacement = replacement; 
} 

@Override 
public RequestPostProcessor beforeMockMvcCreated(
     ConfigurableMockMvcBuilder<?> builder, 
     WebApplicationContext context) { 

return new RequestPostProcessor(){ 

     @Override 
     public MockHttpServletRequest postProcessRequest(
       MockHttpServletRequest request) {       
       request.setRequestURI(StringUtils.replace(request.getRequestURI(), urlPattern, replacement, 1)); 
       request.setServletPath(StringUtils.replace(request.getServletPath(), urlPattern, replacement, 1)); 
      return request; 
     } 
    }; 
} 

, а затем добавить его к каждому из моих интеграционных тестов:

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context) 
      .apply(new ServletPathConfigurer("/ui","")) 
      .alwaysDo(print()) 
      .build(); 
Смежные вопросы