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