[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 メーリングリストの案内