是否有可能在每种情况下都创建全新的模式



是否有一种方法可以在每种情况下创建全新的模式?使用@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>

,其中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>

理想情况下,我希望能够在测试和测试用例之间删除序列。

虽然我不完全知道您的用例是什么,但听起来它很适合尝试Spring 4.1 RC1中新的声明性SQL特性。下面是描述这个新特性的JIRA问题。

你的代码看起来像这样:

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

你可以在这里找到@Sql的Javadoc。

fix-sequence.sql中,您将提供为测试重置db所需的SQL

我能够通过在@Before方法中使用简单的本地sql查询删除序列表来管理这个问题:"drop table hibernate_sequence"。

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

相关内容

  • 没有找到相关文章

最新更新