1

不明な URL が要求され、404 エラーが生成されたときに、Web アプリが実際に正しい場所にリダイレクトされることをテストしたいと思います。

私はこれを機能させることができませんでした。Tomcat が 404 エラーを処理しているため、テストでは forwardedUrl が常に null であると思います。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>

/static のマッピングは、私の春の設定で次のように定義されています。

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

最終的に、不明な URL へのリクエストをモックして、返されるページが /static/error/Sorry.html であることを確認したいと思います。

私は何か間違ったことをしていますか、これは春に404などを処理する方法ではありませんか? 単体テストで転送された URL のチェックは常に null です。

少し異なる質問ですが、関連するのはすべて同じです.Tomcatのエラー処理は、スプリングコントローラーのアドバイス処理に加えてどの時点で呼び出されますか?

4

2 に答える 2

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"));
  }
}

サンプルプロジェクトはこちら. 私は JSP を使用していますが、構成.htmlを変更するだけで切り替えることができInternalResourceViewResolverます。

于 2015-08-17T14:19:58.773 に答える
0

私はSpring 3を使用していますが、いくつか読んだ後、ディスパッチャーサーブレットが例外をスローせずに応答コードを返すだけであることがわかりました。これが、Tomcatが常にこれを処理する理由だと思います。

web.xml からエラー ページ タグを削除すると、Tomcat の一般的な 404 ページが生成されるため、これに対する答えは、Spring 4 にアップグレードして、ディスパッチャ サーブレットに init パラメータを渡して、ページのエラーをスローするように要求することだと思います。見つかりません。

私の理解に役立つかもしれないので、これについて修正していただければ幸いです。

于 2015-08-18T08:28:12.307 に答える