SeamTest Hack
SeamにはIntegrationTest用の機能、SeamTestがありますが、TestNG専用です。
でも自分はJUnit4で使いたいので、SeamTestをHackしてみた。
幸いなことに、SeamTestクラスの機能は親クラスであるBaseSeamTestに集約されており、TestNGに依存する部分だけがSeamTestに実装されている。なので、SeamTestのソースを参考にして、JUnit4用のSeamTestを作れば簡単に対応できそう。
と思っていたのですが、以下のTestNGとJUnit4で微妙に異なる仕様の違いで、SeamTestと全く同じようには作れなさそう。
- TestNGでは@BeforeClass、@AfterClassは非staticメソッドに定義できるが、JUnit4ではstaticメソッドのみにしか定義できない
- TestNGではテストクラスのインスタンスが(たぶん)使い回されるが、JUnit4ではテストメソッド単位でテストクラスが生成される
結局、以下のようにテストメソッド単位でBaseStamTestの初期化、開始、終了、クリーンナップを行うようにした。
package org.jboss.seam.mock; import org.junit.After; import org.junit.Before; public class SeamTest4JUnit extends BaseSeamTest { @Before public void setup() throws Exception { super.init(); super.begin(); } @After public void teardown() throws Exception { super.end(); super.cleanup(); } }
これを利用したテストコードは以下のような感じになる(アノテーションのパッケージがJUnitになるだけ)
package org.domain.sample.test; import org.jboss.seam.mock.SeamTest4JUnit; import org.junit.Test; public class SampleFormTest extends SeamTest4JUnit { @Test public void test1() throws Exception { new FacesRequest() { @Override protected void updateModelValues() throws Exception { //set form input to model attributes setValue("#{sampleForm.value}", "seam"); } @Override protected void invokeApplication() { //call action methods here invokeMethod("#{sampleForm.sampleForm}"); } @Override protected void renderResponse() { //check model attributes if needed assert getValue("#{sampleForm.value}").equals("seam"); } }.run(); } @Test public void test2() throws Exception { new FacesRequest() { @Override protected void updateModelValues() throws Exception { //set form input to model attributes setValue("#{sampleForm.value}", "seam"); } @Override protected void invokeApplication() { //call action methods here invokeMethod("#{sampleForm.sampleForm}"); } @Override protected void renderResponse() { //check model attributes if needed assert getValue("#{sampleForm.value}").equals("seam"); } }.run(); } }
これくらいの単純なパターンしか試していないけど、これでJUnit4でも動きます。