0

Struts 2.3.1.2 にアップグレードしたばかりで、JUnit テストでいくつかの問題があります。

私の古いテストコードはこのようなものでした....

public class HomeActionTest  {

    @Test
    public void testUserNameErrorMessage() throws Exception {
     HomeAction action = new HomeAction();
     setupMocks(action);
     action.execute();
    }
}

アクション クラスの execute メソッドには、次のコードがあります。

    String text = getText(GLOBAL_SELECT);

これにより、LocalizedTextUtil で NullPointerException が発生します...

   ActionContext.getContext()

今、私はこれを試してみることができました...

  ActionContext.setContext(new ActionContext(new HashMap()));

しかし、コンテキストからの Valuestack が null であるため、NullPointerException が発生します。これらの問題を解決しようと何度も試みることはできますが、それは無駄な作業のように思えます。もっと良い方法があるに違いない?!?

良い....

新しいStruts 2.3.xx testing docに従います

私の struts.xml は春に配線されています。

 <action name="secure/home" class="homeAction" method="execute">
            <result>home.jsp</result>
            <result name="input">home.jsp</result>
        <result name="error">error.jsp</result>
 </action>

私のテストクラス

public class HomeActionTest extends StrutsSpringTestCase   {

    @Test
    public void testUserNameErrorMessage() throws Exception {
        ActionProxy proxy = getActionProxy("/secure/home");

        // setup the session
        Map<String, Object> session = new HashMap<String, Object>();  
        ActionContext actionContext = proxy.getInvocation().getInvocationContext();  
        actionContext.setSession(session);  

        HomeAction homeAction = (HomeAction) proxy.getAction();

        proxy.execute();
    }
}

しかし、これは完全に実装された Spring 注入 Action クラスを取得することを意味します! ほとんどの人は「はい!!!」と言うでしょう。この時点で。

私の問題は、これがUNITテストクラスではないことです.DB層までずっと呼び出しを行っています。これは、実行時に配線されているためです。

だからここに私の質問があります、私はそれに到達するのに時間がかかったことを知っています.必要なリソースにアクセスできるActionクラスを取得することは可能ですか(getText()などのメソッド呼び出し用)、しかしすべてがSpringではありません配線?

現時点では、アクションで setServicexxxx に一致するすべてのメソッドを削除するために、リフェクション ルートに進みたいと思っています。少なくとも、テストの実行時に NullPointerException が発生し、そのサービスをモックアウトできますが、それは間違っています。Spring コンテキストの起動に 2 秒も費やさずに、テストを FAST にしたいと考えています。

Struts2.3 は、ユニット テストとは何かというマントラに従わないベース テスト クラスを作成したのはなぜですか?

これは、Struts 2.0.9 (xwork-2.0.3.jar) では問題ありませんでした。

私は何が欠けていますか?

4

1 に答える 1

3

実際、単体テストをできるだけ高速に保つ必要があります (そうでなければ、TDD はありません)。したがって、最小限のストラットセットアップを行う必要があります:(私はmockitoを使用しており、このコードは静的ブロックにあり、完全なコードはこのgistにあります)

ActionContext actionContext = mock(ActionContext.class);
ServletContext servletContext = mock(ServletContext.class);
when(actionContext.getLocale()).thenReturn(Locale.FRENCH);
ValueStack valueStack = mock(ValueStack.class);
Map<String, Object> context = new HashMap<String,Object>();
Container container = mock(Container.class);
XWorkConverter conv = mock(XWorkConverter.class);
when(container.getInstance(XWorkConverter.class)).thenReturn(conv);
when(conv.convertValue(any(Map.class), any(Object.class), any(Class.class))).thenAnswer(new Answer<Object>() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        log.info(invocation.getArguments()[1].toString());
        return "VALUE";
    }

});
context.put(ActionContext.CONTAINER, container);
when(valueStack.getContext()).thenReturn(context);
when(actionContext.getValueStack()).thenReturn(valueStack);
ServletActionContext.setContext(actionContext);
ServletActionContext.setServletContext(servletContext);
于 2012-06-15T13:48:30.697 に答える