1

AbstractTransactionalJUnit4SpringContextTestsを使用して、Spring 2.5.6/Hibernate 3.5.3 プロジェクトのデータベース関連の単体テストを多数作成しました。Device オブジェクトが作成され、同じオブジェクトがすべての Device オブジェクトのリストに含まれていることを確認する 1 つの例:

@ContextConfiguration(locations = { "classpath:/UnitTests-context.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class DeviceDaoTests extends AbstractTransactionalJUnit4SpringContextTests {

    @Test
    public void testGetDeviceList() {
        Device device = new Device();
        this.sessionFactory.getCurrentSession().merge(device);

        Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from Device");
        List<Device> allDevices = myQuery.list();
        assertTrue(allDevices.contains(device);
    }
}

このテストは機能します。

DEVICES という名前のテーブルにマップされる Device クラス:

@Entity
@Table(name = "DEVICES")
public class Device {

//properties omitted for brevity and readability

}

DEVICES テーブル (および他のテーブル) の一部を含む DEVICESLIST_VIEW という名前のデータベース ビューにマップされる、DeviceListItem という名前のクラスもあります。

@Entity
@Table(name = "DEVICESLIST_VIEW")
public class DeviceListItem {

//properties omitted for brevity and readability

}

ここで、データベースにデバイスを挿入すると、すべての DeviceListItem オブジェクトのリストから同じ ID を持つ DeviceListItem が見つかることをテストしたい場合 (最初のテストと同様)、問題があります。次のテストは失敗します。

   @Test
   public void testGetDeviceListItemList() {
      Device device = new Device();
      this.sessionFactory.getCurrentSession().merge(device);

      Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from DeviceListItem");
      List<DeviceListItem> allDeviceListItems = myQuery.list();
      assertTrue(allDeviceListItems.get(0).getId().equals(device.getId())
  }

Web サーバーでアプリケーションを実行すると、すべてのマッピング、DAO クラスなどが機能します。前述の単体テストのみが失敗します。これはおそらく、タイプ Device の新しいオブジェクトが保存されているためですが、読み込まれた項目はタイプ DeviceListItem であり、Hibernate はそれらが同じ基礎となるデータベース テーブルを参照していることを「認識」しておらず、オブジェクトが実際にはデータベースに保存されていないためです。

このテストを機能させる方法、つまり、Device オブジェクトがデータベースに書き込まれ、データベースから DeviceListItem オブジェクトとして読み取られるシナリオをテストする方法はありますか?

(例は非常に単純化されており、実際に実行されたコードから必ずしもコピー/貼り付けされているわけではないため、コード例にはタイプミス、スタイルの問題などがある可能性があることに注意してください)

4

1 に答える 1

0

注釈を追加することで解決

@Rollback(false)

http://static.springsource.org/spring/docs/2.5.6/reference/testing.htmlを参照)メソッドへ

testGetDeviceListItemList

(元の質問を参照)。ただし、これは、Spring Unitテストコンテキストが自動ロールバックを行わないことも意味するため、後で手動でデータベースの状態が通常に戻ることを確認する必要があります。

this.sessionFactory.getCurrentSession().delete(device);

完全な方法:

       @Rollback(false)
       @Test
       public void testGetDeviceListItemList() {
          Device device = new Device();
          this.sessionFactory.getCurrentSession().merge(device);

          Query myQuery = this.sessionFactory.getCurrentSession().createQuery("from DeviceListItem");
          List<DeviceListItem> allDeviceListItems = myQuery.list();
          assertTrue(allDeviceListItems.get(0).getId().equals(device.getId());

          this.sessionFactory.getCurrentSession().delete(device);
      }
于 2012-10-24T15:49:26.093 に答える