1

有没有办法在每个案例上创建全新的模式?这里不使用 @DatabaseTearDown 注释,因为我需要重置 id 生成器,因为我的一些测试期望依赖于它们(也许这是一个不好的做法)

重新安排我的测试的更新:

在我预期的数据集中之一,我有:

<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>

其中术语表中的 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 查询在 @Before 方法中删除序列表来解决这个问题:“drop table hibernate_sequence”。

实际上,更好的解决方案只是<hibernate_sequence next_val="1"/>在 @DatabaseSetup 阶段包含到测试数据集中

于 2014-07-22T07:01:12.903 回答