1

スタンドアロンアプリケーション内でHibernate4.0.1.Finalを使用しています。基盤となるデータベースはMySQL5.5です。JUnit 4.8.1を使用して、データアクセスオブジェクトをテストしています。テストを実行して、JUnitテストが終了したときに、すべての変更がロールバックされるようにします。それを行うためのエレガントな方法はありますか?現在、すべてがコミットされています。これは理にかなっています。これが私のJUnitテストです…</p>

@Before
public void setUp() throws IOException { 
    final InputStream in = getClass().getClassLoader().getResourceAsStream("test.properties");
    testProps = new Properties();
    testProps.load(in);
    final Configuration configuration = new Configuration();
    configuration.configure().setProperty("hibernate.show_sql", "false");
    final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    orgDao = new OrganizationDAOImpl(sessionFactory);
}   // setUp

@Test
public void testInsertSchool() { 
    final Organization org = new Organization();
    org.setOrganizationId(testProps.getProperty("test.id"));
    org.setName(testProps.getProperty("test.name"));
    orgDao.saveOrUpdate(org);
    final Organization foundOrg = orgDao.findById(org.getOrganizationId());
    Assert.assertEquals(org, foundOrg);
}

これがデータアクセスオブジェクトのコードです…</p>

protected void saveOrUpdate(Object obj) {
    try {
        startOperation();
        session.saveOrUpdate(obj);
        tx.commit();
    } catch (HibernateException e) {
        handleException(e);
    } finally {
        session.close();
    }
}

protected Object find(Class clazz, Serializable id) {
    Object obj = null;
    try {
        startOperation();
        obj = session.get(clazz, id);
        tx.commit();
    } catch (HibernateException e) {
        handleException(e);
    } finally {
        session.close();
    }
    return obj;
}
4

2 に答える 2

1

ここで説明するように、私がやろうと決めたのは、HSSqlインメモリデータベースを使用することでした-http: //vageeshhoskere.wordpress.com/2011/06/16/unit-test-with-junit-for-hibernate-using-hsqldb -in-memory/。そうすれば、(サービスレベルで)JUnitテストを繰り返し実行でき、実行するたびに世界の状態が同じになることが保証されます。

于 2012-06-22T20:25:06.003 に答える
0

これを行う方法は、コミットとセッションの終了をデータベース操作から分離することです。すべてのデータベース操作が独自のトランザクションである必要はないので、とにかくそれを行う方が実際には良いと思います。複数の操作で同じセッションを使用でき、複数の操作で同じトランザクションを使用できることには、大きな利点があります。

トランザクションレイヤーを特徴付ける方法は、データベースレベルでアトミックな作業単位を定義するため、ビジネスルールの問題です。これは、persist、find、およびmergeの休止状態操作を抽象化するレイヤーから1つ上のレイヤーである必要があります。理由は次のとおりです。

  1. これにより、アプリケーションのビジネスルールを設計する際の柔軟性が大幅に向上し、さまざまなデータベース操作が相互に依存する新しいケースを処理できるようになります。各ケースのさまざまなトランザクションルールを処理するためだけに、そのデータベースオブジェクトに100万個のメソッドを記述する必要はありません。
  2. それだけでなく、これらの操作を移動することで、単体テストで必要なことを達成できます。
  3. オープン/クローズ操作はコストがかかります。5つのクエリを続けて実行していて、それらが別々のセッションにある理由がない場合は、5つのセッションを開いたり閉じたりしないでください。
于 2012-06-21T14:38:06.237 に答える