1

すべてのケースでまったく新しいスキーマを作成する方法はありますか? @DatabaseTearDown アノテーションの使用はここでは当てはまりません。テストの期待の一部がそれらに依存しているため、ID ジェネレーターをリセットする必要があるためです (おそらくそれは悪い習慣です)。

テストの再配置に関する更新:

私の予想されるデータセットの1つに、次のものがあります。

<field oid="1" type="enumerated" name="simple enum field"
     dict_oid="1" required="0"
     level="1"/>

<field_enum_element field_oid="1"></field_enum_element>
<field_enum_element field_oid="1"></field_enum_element>
<field_enum_element field_oid="1"></field_enum_element>

term テーブルの oid は、生成された ID です。field_enum_element テーブルに 3 行が作成されていることを確認したいのですが、次のように、予想されるデータ セットから生成された ID を省略した場合:

<field type="enumerated" name="simple enum field"
     dict_oid="1" required="0"
     level="1"/>

<field_enum_element></field_enum_element>
<field_enum_element></field_enum_element>
<field_enum_element></field_enum_element>

spring-test-db-unit は、テーブルに 0 行があると考えています

アップデート:

  @Test
  @DatabaseSetup(value = "fieldServiceImplTest/testCreateEnumField.xml")
  @ExpectedDatabase(value = "fieldServiceImplTest/testCreateEnumField.expected.xml",
      assertionMode = DatabaseAssertionMode.NON_STRICT)
  @DatabaseTearDown(value = "fieldServiceImplTest/clear.xml", type = DELETE_ALL)
  public void testCreateEnumField() {
    FieldDTO fieldDTO = new FieldDTO();
    fieldDTO.setName("simple enum field");
    fieldDTO.setType("enumerated");
    fieldDTO.setLevel("term");
    fieldDTO.setIsValueRequired(false);
    fieldDTO.setDictionaryId(dictionaryService.findByOid(1L).get().returnIdentity());

    List<ItemDTO> itemDTOs = Arrays.asList(new ItemDTO(null, "complete"), new ItemDTO(null, "draft"), new ItemDTO(null, "deleted"));
    fieldDTO.setItems(new HashSet<>(itemDTOs));

    fieldService.createField(fieldDTO);
  }

testCreateEnumField.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <dictionary changed="2014-01-31 18:11:54" oid="1" client_oid="1" descr="descr" name="dictionary"/>

</dataset>

testCreateEnumField.expected.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset reset_sequences="hibernate_sequence">
  <dictionary changed="2014-01-31 18:11:54" oid="1" client_oid="1" descr="descr" name="dictionary"/>
  <field client_oid="1" oid="1" type="enumerated" name="simple enum field"
         dict_oid="1" required="0"
         level="1"></field>

  <enum_element oid="11" client_oid="1" value="deleted"></enum_element>
  <enum_element oid="12" client_oid="1" value="draft"></enum_element>
  <enum_element oid="13" client_oid="1" value="complete"></enum_element>

  <field_enum_element field_oid="1"></field_enum_element>
  <field_enum_element field_oid="1"></field_enum_element>
  <field_enum_element field_oid="1"></field_enum_element>

</dataset>

理想的には、テストとテスト ケースの間でシーケンスを削除できるようにしたいと考えています。

4

2 に答える 2

1

あなたのユースケースが何であるかは正確にはわかりませんが、Spring 4.1 RC1 の新しい宣言型 SQL 機能を試すのに適しているようです。これは、この新機能について説明している JIRA の問題です。

コードは次のようになります。

@Test
@Sql("fix-sequence.sql")
public void test() {
   //whatever
}

@Sql の Javadoc はこちらにあります。

内部fix-sequence.sqlでは、テスト用にデータベースをリセットするために必要な SQL を提供します。

于 2014-07-22T07:05:17.060 に答える
0

シンプルなネイティブSQLクエリ「ドロップテーブルhibernate_sequence」を使用して@Beforeメソッドでシーケンステーブルをドロップすることで、少し回避策を講じることで問題を管理できました。

実際、より良い解決策は<hibernate_sequence next_val="1"/>、@DatabaseSetup フェーズでテスト データセットに含めることです。

于 2014-07-22T07:01:12.903 に答える