[cubby-user:67] CubbyTestCase における Action クラスへの値のバインディングについてのご報告
Takashi Someda
[E-MAIL ADDRESS DELETED]
2008年 5月 30日 (金) 13:00:53 JST
染田です。
またまたテストネタで申し訳ありません。
Action クラスにおける、プロパティバインディングが非常に便利で
利用させて頂いているのですが、TestCase 内に対象のアクションを
オートバインディングさせていると、S2Container 側で設定される暗黙
オブジェクトと、Cubby の InitializeInterceptor で設定される値に差異が
生じます。
具体的に、以下の BindingAction のparam オブジェクト
(S2Container がバインド) と p (InitializeInterceptor がバインド)
というプロパティですが、BindingActionTest 内に BindingAction
自身をフィールド設定しているか、いないかで結果が異なります。
前者のテストケース内に Action オブジェトをバインディング
している場合、param からの取得は null で、後者であれば、
どちらからも問題なく取得できます。
----- BindingAction -----
public class BindingAction extends Action {
public Map param;
public String p;
public ActionResult index() {
System.out.println("parameter name p from field " + p);
System.out.println("parameter name p from param map " + param.get("p"));
return new Forward("index.html");
}
}
----- BindingActionTest -----
public class BindingActionTest extends CubbyTestCase {
// この値を設定するか否かで挙動が変わる
public BindingAction action;
public void testIndex() throws Exception {
getRequest().addParameter("p", "nice!!");
processAction("/binding/");
}
}
-----
一通りおってみたところ、テストケース内に、アクションクラスが
いる場合、S2Framework#bindFields がテスト実行前に呼ばれ、
そのタイミングで暗黙オブジェクトが設定されます。で、ActionProcessorImpl
内では、そこで作られた Action を利用してしまうので、param などの
暗黙オブジェクトは設定されないままとなっているようです。
手元では、以下のようなメソッドを processAction の呼び出し前に行い、
request.addParameter などがされた後の処理を入れて対応しています。
# 他にも良い方法あるかもしれないのですが。。。
----
protected void reassemble() {
for (Class clazz = getClass(); clazz != CubbyTestCase.class
&& clazz != null; clazz = clazz.getSuperclass()) {
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (Action.class.isAssignableFrom(f.getType())
&& getContainer().hasComponentDef(f.getType())) {
Object component = getComponent(f.getType());
AutoPropertyAssembler assembler = new
AutoPropertyAssembler(getComponentDef(f.getType()));
assembler.assemble(component);
}
}
}
}
------
cubby のドキュメントには、暗黙オブジェクトの記述も、
またテストケース内に、対象のアクションクラスをフィールド設定
する例も載っておりますので、ドキュメントに注意事項として記載
して頂くか、もしくは processAction 前後で、該当のテストケースに
アクションがフィールド設定してある場合には、再度 assemble
するような処理を入れていただけると嬉しいかな、と思いご報告
させて頂きました。
以上、よろしくお願い致します。
染田
--
SOMEDA Takashi
[E-MAIL ADDRESS DELETED]
http://d.hatena.ne.jp/tksmd/
cubby-user メーリングリストの案内