2010/01/04 18:11
FlatXmlDataSet을 이용하여 테스트 할 때 null 데이터 처리 방법 테스트도구/DBUnit2010/01/04 18:11
DBUnit을 사용하여 테스트를 할 경우 IDataSet을 FlatXmlDataSet으로 할 경우 xml 속성으로 채우기 때문에 사용하기가 무척이나 간편합니다. 하지만 단점이 하나 존재합니다. 바로 null 컬럼이 있을 경우 첫 row가 null이면 다른 row도 값이 있음에도 불구하고 데이터가 들어가지 않아 테스트가 실패하는 경우가 있습니다.
이러한 경우가 발생하는 이유는 FlatXmlDataSet의 경우 첫 row의 컬럼정보를 읽어드려서 모든 row에 적용하기 때문입니다. 때문에 처음에 null 처리를 하기 위해서 해당 컬럼에 대한 데이터를 입력하지 않게 되고, 다른 row에 해당 컬럼이 있음에도 불구하고 데이터가 입력되지 않지요.
간단한 예를 하나 들어보겠습니다. 다음과 같은 테이블이 있다고 합시다.
create table org (
org_id integer not null,
org_name integer not null,
parent_org_id integer null
org_id integer not null,
org_name integer not null,
parent_org_id integer null
)
간단한 조직테이블입니다. 조직의 ID와 이름, 그리고 상위 조직에 대한 ID를 가지고 있지요. 이러한 테이블의 경우 최상위 조직은 상위 조직에 대한 ID값이 null일 수 있습니다.
dbunit을 통한 dataset은 다음과 같은 모양을 하고 있습니다.
<dataset>
<org org_id="1" org_name="최상위부서" />
<org org_id="2" org_name="하위부서" parent_org_id="1" />
</dataset>
<org org_id="1" org_name="최상위부서" />
<org org_id="2" org_name="하위부서" parent_org_id="1" />
</dataset>
이런 구조일 때 dbunit을 실행하게 되면 두번째 데이터인 하위부서의 상위조직ID가 분명 1이 들어가야하지만 실제로는 들어가지 않게 되지요. 이 문제는 DbUnit.org에서도 언급하고 있습니다.
이 문제를 해결하기 위해서는 위의 링크에서도 언급했듯이 DTD를 작성하면 됩니다. 제일 간단하게는 xml파일에 직접 넣어주면 가장 편합니다.
<!DOCTYPE dataset [
<!ELEMENT dataset (org*)>
<!ATTLIST org org_id CDATA #REQUIRED>
<!ATTLIST org org_name CDATA #REQUIRED>
<!ATTLIST org parent_org_id CDATA #IMPLIED>
]>
<!ELEMENT dataset (org*)>
<!ATTLIST org org_id CDATA #REQUIRED>
<!ATTLIST org org_name CDATA #REQUIRED>
<!ATTLIST org parent_org_id CDATA #IMPLIED>
]>
위와 같이 xml 가장 위쪽에 정의해주시면 첫번째 row의 값이 null이 있더라도 정상적으로 동작하게 됩니다. ^^
'테스트도구 > DBUnit' 카테고리의 다른 글
| FlatXmlDataSet을 이용하여 테스트 할 때 null 데이터 처리 방법 (0) | 2010/01/04 |
|---|

