使ってみよう。・・・その2


前回うまくいったはずが、とんだオチが残っていた。

ここ*1を参考にしつつ、まずは継承元を変更。

extends DatabaseTestCase


そうすると継承していないメソッドがあるので、追加する。

 /* (non-Javadoc)
  * @see org.dbunit.DatabaseTestCase#getConnection()
  */
 protected IDatabaseConnection getConnection() throws Exception {
   return new DatabaseConnection(session.connection());
 }

 /* (non-Javadoc)
  * @see org.dbunit.DatabaseTestCase#getDataSet()
  */
 protected IDataSet getDataSet() throws Exception {
   return new FlatXmlDataSet(new File("src/test/conf/domain/prepareUser.xml"));
 }

こやつらはsetUp()から自動的に呼ばれるようなので(たぶん)、setUp()に中に記述すると二重に実行される。

また、途中で追加したclose()処理は不要なようだ(というかExceptionになる)。

 /*
  * (non-Javadoc)
  * @see junit.framework.TestCase#tearDown()
  */
 protected void tearDown() throws Exception{
 /*
  if (tx != null) {
   try {
    tx.rollback();
   } catch (Exception e) {
    assertTrue(false);
   }
  }
  if (session != null) {
   try {
    session.close();
   } catch (Exception e) {
    assertTrue(false);
   }
  }
 */
  super.tearDown();
 }

setUp()も次のように変更した

 /*
  * @see TestCase#setUp()
  */
 protected void setUp() throws Exception {
  //テスト対象クラスの作成
  dao = (userDao) context.getBean("userDao");
  //DB接続情報の取得
  sf = dao.getSessionFactory();

  session = sf.openSession();
  tx = session.beginTransaction();

  super.setUp();
 }


テストデータ(prepareUser.xml)。

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
 <USER USER_ID="testUser"
    PASSWORD="userPass"/>
</dataset>


これでテスト実行。

hoge.DataNotFoundException: そんな人いませんよん
 at hoge.UserDaoImpl.getUser(UserDaoImpl.java:39)
 at hoge.UserDaoTest.testGetUser(UserDaoTest.java:109)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:324)
 at junit.framework.TestCase.runTest(TestCase.java:154)
 at junit.framework.TestCase.runBare(TestCase.java:127)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:118)
 at junit.framework.TestSuite.runTest(TestSuite.java:208)
 at junit.framework.TestSuite.run(TestSuite.java:203)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:436)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:311)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

・・・自分で書いたExceptionのメッセージに腹を立てても仕方がない。落ち着け、自分。

先達たちのページを見直す。


むむ、setUp()の中でなにやら一行いらないぞ*2

  //tx = session.beginTransaction();


再実行。



・・・デケタ!!!


理由は・・・きっと手動でトランザクションを切り出すとautoCommitされないでrollback()されるんだよ、うん。
今日は(も)疲れたので深く考えないでおく。