かとじゅんの技術日誌

技術の話をするところ

単体テストを書いてみる

TeedaTestCaseを使えばよいのですが,ページクラスではDaoを使うことが多いため,S2TestCaseのtestXXXTxのようにテスト関数を抜けたらDBに対する操作をロールバックするような機能がほしくなります.
がしかし,TeedaTestCaseはS2TestCaseから派生されていませんし,そもそもそのような機能は実装されていないようなので,TeedaTestCase上でTransactionManagerをDIして,以下のような同等な機能を実装します.

public class UserLoginPageTest extends TeedaTestCase {

	private static final String PATH = "app.dicon";

	private TransactionManager transactionManager;

	private UserLoginPage page;

	private UserInfoDao userInfoDao;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.include(PATH);
	}

	@Override
	protected void setUpAfterBindFields() throws Throwable {
		super.setUpAfterBindFields();
		this.transactionManager.begin();
		this.insertUserInfo();
	}

	private void insertUserInfo() {
		UserInfo userInfo = new UserInfo();
		userInfo.setUserId("hogehoge");
		userInfo.setEmailAddress("hoge@hoge.com");
		this.userInfoDao.insert(userInfo);
	}

	@Override
	protected void tearDownBeforeUnbindFields() throws Throwable {
		this.transactionManager.rollback();
		super.tearDownBeforeUnbindFields();
	}

	public void testInitialize() {
		String result = this.page.initialize();
		assertNull(result);
	}

	public void testDoOnceLogin() {
		this.page.setUserId("hogehoge");
		this.page.setPassword("hogehoge");
		String result = this.page.doOnceLogin();
		assertEquals(result, "hogehoge");
	}

}

TeedaTestCaseでもTxなテストメソッドかけるようなるといいですが,とりあえずこんな感じの対応になるかと思います.