4

そのため、Springweb-mvcアプリケーションをテストドライブするという目標がほぼ達成されています。私たちはSpringセキュリティを使用してURLまたはメソッドを保護しており、Spring-Web-Mvcを使用してコントローラーをテストしたいと考えています。問題は次のとおりです。Springセキュリティはweb.xmlで定義されたFilterChainに依存しています。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

spring-web-mvcは、カスタムコンテキストローダーを使用しても、通常のアプリケーションコンテキストのものしかロードできません。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {
        "file:src/main/webapp/WEB-INF/servlet-context.xml", "file:src/main/webapp/WEB-INF/dw-manager-context.xml" })
public class MvcTest {

    @Inject
    protected MockMvc mockMvc;

    @Test
    public void loginRequiredTest() throws Exception {

        mockMvc.perform(get("/home")).andExpect(status().isOk()).andExpect(content().type("text/html;charset=ISO-8859-1"))
        .andExpect(content().string(containsString("Please Login")));
    }

}

ご覧のとおり、/ homeを呼び出すと、匿名ユーザーがログインするように求められるようにWebアプリを設定しました。これは、web.xmlを使用して正常に機能していますが、これをテストに統合する方法がわかりません。 。

spring-test-mvcにフィルターを追加する方法はありますか?

今、私はから始めて、どの実装をGenericWebContextLoader掘り下げ、そこに何らかの方法でフィルターを追加し、次に私の実装を使用するように指示する必要があるかもしれないと思っています...しかし、私はWebスタック全体にかなり慣れていないので、明らかにそのようなものを掘り下げることを避けるのに役立つより簡単な解決策...MockRequestDipatcherRequestDispatcherGenericWebContextLoader

そこに何かアイデア/解決策はありますか?

とにかく手動でフィルターを追加するにはどうすればよいですか?web.xmlだけがそれを行う場所ではありません...

ありがとう!

4

1 に答える 1

6

たぶん、あなたはフィルターチェーンをあざけることができます。それを行うためのクラスが春にあります。コードは次のようになります。

     MockHttpServletRequest request = new MockHttpServletRequest();
     request.setServletPath("/foo/secure/super/somefile.html");

     MockHttpServletResponse response = new MockHttpServletResponse();
     MockFilterChain chain = new MockFilterChain(true);

     filterChainProxy.doFilter(request, response, chain);

次に、org.springframework.web.filter.DelegatingFilterProxyインスタンスをコードのチェーンに追加できます。何かのようなもの:

このフォーラムスレッドも参照してください。

于 2012-06-14T09:42:24.943 に答える