33

httpセッションごとにユーザーデータを保持するセッションスコープのBeanがあります。セッション スコープ Bean をテストする Junit テスト ケースを作成したいと思います。Bean がセッションごとに作成されていることを証明できるように、テスト ケースを作成したいと思います。このような Junit テスト ケースを作成する方法についての指針はありますか?

4

3 に答える 3

30

単体テストでリクエストスコープとセッションスコープを使用するには、次のことを行う必要があります。

  • これらのスコープをアプリケーションコンテキストに登録する
  • モックセッションを作成してリクエストする
  • 経由でモックリクエストを登録するRequestContextHolder

このようなもの(Spring TestContextを使用してテストを実行すると仮定します) abstractSessionTest.xml::

<beans ...>
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="session">
                    <bean class="org.springframework.web.context.request.SessionScope" />
                </entry>
                <entry key="request">
                    <bean class="org.springframework.web.context.request.RequestScope" />
                </entry>
            </map>
        </property>
    </bean>
</beans>

@ContextConfiguration("abstractSessionTest.xml")
public abstract class AbstractSessionTest {
    protected MockHttpSession session;
    protected MockHttpServletRequest request;

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

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

これで、テストコードで次のメソッドを使用できます。

startSession();
startRequest();
// inside request
endRequest();
startRequest();
// inside another request of the same session
endRequest();
endSession();
于 2011-02-28T09:14:27.250 に答える
30

私はこのより単純なアプローチに出くわしました.他の人が必要とする場合に備えて、ここに投稿したほうがよいと思いました.

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="session">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

このアプローチでは、リクエスト/セッション オブジェクトをモックする必要はありません。

ソース: http://tarunsapra.wordpress.com/2011/06/28/junit-spring-session-and-request-scope-beans/

于 2012-01-10T12:19:38.060 に答える