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でも動きます。