Struts2をやってみる (2) - Actionのテスト -

2013-09-15T00:00:00+00:00 Java Struts2

まぁサブタイトル?通り。struts2-junit-pluginっていうのを利用する事でorg.apache.struts2.StrutsTestCaseっていうのが利用できそれを使う事でコントローラー部分なテストをする事が可能な模様

導入

build.gradleに

dependencies {
    compile "javax.servlet:servlet-api:2.5"
    testRuntime "javax.servlet:jsp-api:2.0"
    testCompile "org.apache.struts:struts2-junit-plugin:2.3.15.1"
}

的な設定。servlet-apiとjsp-apiがテストをする際に必要な模様なのでそいつらも入れてやる

src/test/java/sample/action/IndexActionTestCase.java

package sample.action;

import org.apache.struts2.StrutsTestCase;
import org.junit.Test;

import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionSupport;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

public class IndexActionTestCase extends StrutsTestCase {

    @Test
    public void test_execute() throws Exception {
        request.setParameter("name", "hoge");

        ActionProxy proxy = getActionProxy("/sample/index.action");
        assertThat(proxy, notNullValue());

        String result = proxy.execute();
        assertThat(result, is(ActionSupport.SUCCESS));

        IndexAction action = (IndexAction)proxy.getAction();
        assertThat(action, notNullValue());

        assertThat(action.getName(), is("hoge"));


        /* こうするとテストがコケる
        String result = action.execute();
        assertThat(result, is(ActionSupport.SUCCESS));
        assertThat(action.getName(), is("hoge")); // null
        */
    }
}

ActionProxy経由からexecuteする分にはいいけど、getActionでアクションクラスを取得後普通にexecuteを実行してもただインスタンスメソッドとして実行しているだけなのでパラメーターとかが作用しないだろうと。executeでなんかしてるならまだしもそうじゃないならActionProxy経由でやる方が良いのではと

あととりあえずはテストに関して規約上の制限がある訳でも無さそうなので、コントローラー上のプロパティとかはパッケージプライベートとかで定義してテストするっていう方式が望ましいのかも

あとバリデーターとか色々勉強していない所な件もあるので追記するか、その要件毎にテスト手法的な辺りも踏まえて書く予定

Struts2をやってみる (3) - <result>のtypeに関して Struts2をやってみる (1)