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) では問題ありませんでした。
私は何が欠けていますか?