是否有一种方法可以在每种情况下创建全新的模式?使用@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"/>
包含到测试数据集中