[cubby-user:68] Re: CubbyTestCase における Action クラスへの値のバインディングについてのご報告

AGATA Toshitaka [E-MAIL ADDRESS DELETED]
2008年 6月 1日 (日) 00:48:42 JST


縣です。

詳細な報告と改善案、ありがとうございます。
(テストネタ大歓迎です)

> して頂くか、もしくは processAction 前後で、該当のテストケースに
> アクションがフィールド設定してある場合には、再度 assemble
> するような処理を入れていただけると嬉しいかな、と思いご報告
> させて頂きました。

テストからのAction実行時も、プロパティのバインディングの挙動が、
通常のAction実行と同じ挙動になるように、対応したいと思います。

特に問題がなければ、頂いたコードをCubbyTestCaseに取り入れて、
processActionの先頭でassembleする予定です。

よろしくお願いします。

Takashi Someda さんは書きました:
> 染田です。
> 
> またまたテストネタで申し訳ありません。
> 
> 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
> するような処理を入れていただけると嬉しいかな、と思いご報告
> させて頂きました。
> 
> 以上、よろしくお願い致します。
> 
> 染田


-- 
-------------------------------
株式会社ヌーラボ 縣 俊貴
Mail : [E-MAIL ADDRESS DELETED]
HP   : http://www.nulab.co.jp/
TEL  : 03-5766-6256(東京)
      092-724-0020(福岡)
-------------------------------


cubby-user メーリングリストの案内