2013-11-15 58 views
1

在我的web.xml我映射的servlet/API這樣的:如何在Spring MVC REST測試中重定向重定向模擬請求?

<servlet-mapping> 
    <servlet-name>todo</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 
<servlet> 
    <servlet-name>todo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

所以使用@RequestMapping(value = "/todo", method = RequestMethod.GET)控制器,它實際上被映射爲 「/ API/TODO」

但在測試時,我打電話給mockMvc.perform(get("/api/todo/"))我得到了404.我必須撥打get("/todo/")才能在測試中獲得正確的映射。我希望像在實際場景中那樣將控制器映射到測試中。那可能嗎?

我使用測試WebMvcConfigurerAdapter,我試圖

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/api/**").addResourceLocations("/"); 
} 

,但沒有奏效。

回答

1

當您設置MockMvc配置時,您會注意到您沒有指定部署描述符的位置,即web.xml。這是因爲MockMvc未測試您的DispatcherServlet的配置。它測試你的MVC配置,@Controller豆等。

如果您查看源代碼,MockMvc會創建一個加載並使用您的Web應用程序上下文的TestDispatcherServlet

換句話說,servlet url-pattern路徑與MockMvc無關。你提出你的請求,好像沒有這樣的路徑。

幽州

我希望在測試控制器映射像實際場景。

您需要使用不同的測試策略。完全部署您的Web應用程序並使用HTTP客戶端發出請求並驗證您返回的內容。

您已標記爲unit-testing。在完整的環境中測試不是單元測試,而是集成和系統測試。


注意,這

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/api/**").addResourceLocations("/"); 
} 

無關上述。它的目的是在你的web應用程序中爲某些路徑提供靜態資源。它與你的servlet的url-pattern或你的控制器的路徑無關。

+0

這很有道理。謝謝。 – NSF