2014-07-15 27 views
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。我想肯定是有3行中field_enum_element表上創建,但如果我忽略從預期的數據集生成的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> 

彈簧試驗-DB-單位認爲有在0行表

UPDATE:

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

理想我想能夠測試和測試用例之間下降序列。

+0

而不是對每個測試創建一個新的架構中的SQL,你可以更新你的測試,使他們獨立ID生成初始值的? – gontard

+0

剛剛更新了我的問題 –

+0

你能發表一個你的測試樣子的例子嗎?您是否還需要在每次測試之前或每次測試課程之前創建模式? – geoand

回答

1

雖然我並不確切地知道你的使用情況是什麼,它聽起來就像是一個很好的適合嘗試新的聲明SQL特性在Spring 4.1 RC1中。 Here是描述這個新功能的JIRA問題。

您的代碼看起來是這樣的:

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

你可以找到@sql here的Javadoc中。

裏面fix-sequence.sql你提供需要的重置分貝測試

+0

謝謝,我可能會在4.1 Release發佈時使用這個功能。至於現在我想我會通過使用@PersistenceContext注入到我的測試中並從中執行drop sequence query。 –

+0

@ stanislav.chetvertkov您的歡迎!我建議你在RC1中使用Spring 4.1之後再試試這個功能,當發佈版本可用時,你實際上可以將測試遷移到它。看起來這個功能會爲你節省很多儀式代碼。 – geoand

+0

雖然它解決了這個問題,但它仍然是一個解決方法。理想情況下,我想給結果集中的行數提供dbunit提示。 –

0

我能夠通過在簡單的本地sql查詢中使用@Before方法刪除序列表來執行一些小的解決方法來管理問題:「drop table hibernate_sequence」。

其實,更好的解決方案僅僅是包括<hibernate_sequence next_val="1"/>成@DatabaseSetup階段測試數據集

相關問題