3

序章

Java / Tomcat / Spring 2.5 / Spring Webflow2.0.9Webアプリケーションがあります。一部のページをテストするために、フォームオブジェクトに値を設定し、ブラウザーからの要求を模倣するJUnitテストを作成しました。JUnitテストクラスは次のようになります。

@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = { "classpath:/WebTests-context.xml", "classpath:/messageSourceConfig.xml" })
@RunWith(SpringJUnit4ClassRunner.class)

public class InitechValidatorTests {

    protected MockHttpSession session;
    protected MockHttpServletRequest request;

    //test methods omitted

    protected void startSession() {
        session = new MockHttpSession();
    }

    protected void endSession() {
        session.clearAttributes();
        session = null;
    }

    protected void startRequest() {
        request = new MockHttpServletRequest();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));

        MockRequestContext mrc = new MockRequestContext();
        org.springframework.webflow.execution.RequestContextHolder.setRequestContext(mrc);

        MessageContext messageContext = org.springframework.webflow.execution.RequestContextHolder.getRequestContext()
                .getMessageContext();
        this.validationContext.setMessageContext(messageContext);
    }

    protected void endRequest() {
        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
        RequestContextHolder.resetRequestAttributes();
        request = null;

        org.springframework.webflow.execution.RequestContextHolder.setRequestContext(null);
    }
}

テストメソッドごとに、startRequestメソッドとendRequestメソッドを呼び出します(startSessionは最初のテストメソッドの前に呼び出され、endSessionは最後のテストメソッドの後に呼び出されます)。この構成がないと、テストしているコードでRequestContextHolderなどを使用できませんでした。

問題

テストするクラスでは、次のようにWebフローからリクエストパラメーターの内容を読み取ります。

RequestContext requestContext = RequestContextHolder.getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
String printPressed = externalContext.getRequestParameterMap().get("printPressed");

JUnitテストメソッドで「printPressed」リクエストパラメータを次のように設定する必要があります。

org.springframework.webflow.execution.RequestContext requestContext = org.springframework.webflow.execution.RequestContextHolder
                    .getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
Map requestParamMap = externalContext.getRequestParameterMap().asMap();
requestParamMap.put("printPressed", "true");

ただし、マップは不変であり、UnsupportedOperationExceptionが発生するため、これは不可能です。

問題は、リクエストパラメータをクラスorg.springframework.webflow.context.ExternalContextのrequestParameterMapに設定する方法です。getRequestParameterMapによって返されるパラメーターマップは不変であるため、そこにパラメーターを追加することはできません。たとえば、オブジェクトMockParameterMapがあることに気付きました。これは、「パラメーターの変更を可能にするパラメーターマップの拡張です。テストのスタブとして役立ちます」と有望に聞こえます。

MockParameterMapをテストクラスのExternalContextに注入するにはどうすればよいですか?または、単体テストのリクエストパラメータを設定する他の方法はありますか?

4

1 に答える 1

4

MockParameterMapを新しいMockExternalContextオブジェクトに設定するように startRequest メソッドを変更して問題を解決しました。これは次のようにMockRequestContextに設定されます。

MockParameterMap mpp = new MockParameterMap();
MockExternalContext mec = new MockExternalContext(mpp);
mrc.setExternalContext(mec);

次に、JUnit テスト メソッドで、次のようにパラメーターを設定できます。

org.springframework.webflow.execution.RequestContext requestContext = org.springframework.webflow.execution.RequestContextHolder
                    .getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
MockParameterMap requestParameterMap = (MockParameterMap) externalContext.getRequestParameterMap();
requestParameterMap.put("printPressed", "true");
于 2012-05-15T13:42:56.010 に答える