Struts2をやってみる (2) - Actionのテスト -
まぁサブタイトル?通り。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経由でやる方が良いのではと
あととりあえずはテストに関して規約上の制限がある訳でも無さそうなので、コントローラー上のプロパティとかはパッケージプライベートとかで定義してテストするっていう方式が望ましいのかも
あとバリデーターとか色々勉強していない所な件もあるので追記するか、その要件毎にテスト手法的な辺りも踏まえて書く予定