[Seasar-user:19130] removeActionForm=true時のS2ActionTestCaseを使ったテストコードについて
中村洋
[E-MAIL ADDRESS DELETED]
2010年 1月 14日 (木) 20:32:30 JST
お世話になっております、中村と申します。
以下のことをご教授いただければ幸いです。
#長文、失礼いたします。
***********************
【内容】
removeActionForm=trueが設定されているメソッドをS2ActionTestCase※を使い
テストするとNullPointerExceptionが発生します。
※S2ActionTestCase
id:newtaさんが「[Java][Seasar]SAStrutsのActionのバリデーションも
UnitTestしちゃおうの巻」(http:
//d.hatena.ne.jp/newta/20090810/1249920390)で公開している
S2ActionTestCaseを継承したクラスです。
【関連コード】
//◆Actionクラスのテスト対象メソッド(DeptAction.java)
@Execute(validator = false, removeActionForm = true)
public String sampleMethod(){
return "sampleMethod";
}
//◆テストコード(DeptActionTest.java)
public void testSampleMethod() {
super.initAction(DeptAction.class);
assertEquals(super.executeAction("sampleMethod"),"sampleMethod");
assertNull(getErrors());
}
//◆Formクラス(DeptForm.java)
import java.io.Serializable;
@Component(instance = InstanceType.SESSION)
public class DeptForm implements Serializable{
private static final long serialVersionUID = 1L;
public String id = "";
}
上記の状態でテスト(DeptActionTest.java)を実施した際にエラー(スタックト
レースは後述)となります。
【補足情報】
・バージョン(Doltengの情報から取得)
Seasar2:2.4.39
SAStruts:1.0.4-sp6
・removeActionFormを削除して実施した場合、エラーがなくテストが終了します。
・S2ActionTestCaseのexecuteActionを使わず、S2ActionTestCaseからActionク
ラスのインスタンスを作って実行すれば、アノテーションに関わらず、エラーが
なくテストが終了します。
・(仮説)removeActionForm要素はSessionを削除する処理だが、テスト実行時に
はSessionオブジェクトが作成されていない。にも関わらず、Sessionオブジェク
トを削除しようとするため、NullPointerエラーが発生しているのでは?と考え
ています。
・ひがさんのコメント※に「S2TestCaseにはセッションオブジェクトはモックが
既に設定済み〜」とあり、これを使えば良いのかと思っていますが、その使い方
が分かっていません。
※URL:http://d.hatena.ne.jp/unageanu/20070925/1190726776
【スタックトレース】
java.lang.RuntimeException: java.lang.NullPointerException
at
org.seasar.struts.unit.S2ActionTestCase.executeAction(S2ActionTestCase.java:144)
at
jp.ne.sastruts.start2.action.DeptActionTest.testSampleMethod5(DeptActionTest.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:164)
at
org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:519)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:103)
at
org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:308)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at
org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.NullPointerException
at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:143)
at org.seasar.struts.action.ActionWrapper.execute(ActionWrapper.java:87)
at
org.seasar.struts.unit.S2ActionTestCase.executeAction(S2ActionTestCase.java:141)
... 22 more
***********************
以上です。
何らかのヒント等いただけると幸いです。
失礼いたします。
**************************************
Name:Yoh Nakamura
Mail:[E-MAIL ADDRESS DELETED]
**************************************
Seasar-user メーリングリストの案内