2014-07-15 4 views
1

모든 경우에 완전히 새로운 스키마를 만드는 방법이 있습니까?모든 경우에 완전히 새로운 스키마를 만들 수 있습니까?

하나에 : 내가 다시 정렬에

업데이트 내 시험 (아마 나쁜 관행이다) 그들에 의존하는 내 테스트 기대의 일부로서 ID 발전기를 재설정해야하기 때문에 @DatabaseTearDown 주석을 사용 여기이 아니다 내 예상 데이터 세트 중 :

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

스프링 테스트 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

에 대한 DB를 재설정하는 대신 각 시험에서 새로운 스키마를 생성에 필요한 SQL을 제공 할 것이다? – gontard

+0

방금 ​​내 질문 업데이트 –

+0

테스트를 어떻게 보이는지 예제를 게시 할 수 있습니까? 또한 각 테스트 전에 또는 각 테스트 클래스 앞에 스키마를 만들어야합니까? – geoand

답변

1

, 그것은 소리 스프링 4.1 RC1의 SQL 기능. 이 새로운 기능을 설명하는 JIRA 문제는 Here입니다. 당신은 @Sql here의 자바 독을 찾을 수 있습니다

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

:

코드는 같을 것이다. fix-sequence.sql 내부

당신은 아이디 생성기 시작 값의 그들이 독립적 인 확인하기 위해 테스트를 업데이트 할 수있는, 테스트

+0

감사합니다. 4.1 릴리스가 도착할 때마다이 기능을 사용할 것입니다. 필자는 @PersistenceContext를 내 테스트에 삽입하고 드롭 시퀀스 쿼리를 실행함으로써 얻을 수 있다고 생각한다. –

+0

@ stanislav.chetvertkov 환영합니다! Spring 4.1이 RC1에 있기 때문에이 기능을 시험해 볼 것을 제안합니다. 릴리스가 출시되면 실제로 테스트를 마이그레이션 할 수 있습니다. 이 기능을 사용하면 많은 의식 코드가 저장되는 것 같습니다. – geoand

+0

문제가 해결되지만 여전히 해결 방법입니다. 이상 적으로 dbunit에 결과 집합의 행 수에 대한 힌트를 제공하려고합니다. –

0

단순한 기본 sql 쿼리 "drop table hibernate_sequence"를 사용하여 @Before 메서드에서 시퀀스 테이블을 삭제함으로써 약간의 문제를 해결함으로써이 문제를 관리 할 수있었습니다. 내가 정확히 사용 사례가 무엇인지 알 수 없지만이 새로운 선언을하려고에 적합한이처럼

사실, 더 나은 솔루션은 단지 @DatabaseSetup 단계에서 테스트 데이터 세트에 <hibernate_sequence next_val="1"/>을 포함하는 것입니다