2015-08-17 19 views
1

我想考,當請求一個未知的網址,並生成一個404錯誤,我的web應用程序實際上重定向到正確的地方。彈簧單元測試404 一個未知的URL在模擬MVC

我還沒有能夠得到這個工作,我想是因爲Tomcat是處理404錯誤,所以forwardedUrl總是空的測試。我知道這在現實中是有效的,因爲如果我在網址中輸入一些垃圾,我的應用程序會重定向到我的自定義頁面。

我的單元測試看起來像:

@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/" /> 

最終,我想嘲笑一個未知網址的請求,然後檢查返回的頁面是/ static/erro R/Sorry.html。

難道我做錯了什麼,或者這是不是處理404等在春天的路上?單元測試中轉發的url的檢查始終爲空。

一個稍微不同的問題,但相關的所有相同的是,在不tomcat的錯誤處理被調用在什麼點及以上的春天控制器建議處理?

+0

你介意分享你的Spring的Dispatcher Servlet配置嗎?只是要確定... –

+0

不,我會編輯我的問題。謝謝 – berimbolo

回答

0

我使用的彈簧3和周圍的一些閱讀後,我已經找到了調度員的servlet只是返回一個響應代碼未拋出我的猜測是,爲什麼總是tomcat的處理這個異常。

從web.xml中刪除錯誤頁面標籤導致了一個tomcat通用404頁面,所以我認爲答案是升級到spring 4,然後我可以將init參數傳遞給調度程序servlet,請求它拋出一個找不到頁面錯誤。

我很高興能在這個雖然因爲它可以幫助我的理解更正。

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,但只需更改InternalResourceViewResolver配置即可切換到.html

+0

我沒有一個控制器可以處理這個問題,它肯定是引擎蓋下的一些彈簧控制器,我猜? /static/error/Sorry.html實際上是/ webapp/resources目錄中的物理html文件。 – berimbolo

+0

但是,如果你沒有處理該「視圖」的「控制器」,那麼Spring MVC將無法訪問該URL ......或者我在這裏丟失了什麼東西?讓我們等待「騎兵」。 –

+0

嗯,我認爲這將是調度servlet最終,因爲它在處理'/'的web.xml,所以我認爲,即使tomcat重定向到/靜態/錯誤/抱歉。服務器端需要處理的東西,除了調度程序servlet沒有其他定義,所以我假設在我的單元測試中,轉發的url將從we.xml錯誤頁面位置屬性中獲取... – berimbolo