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