이전 글에서 Controller와 Service Layer를 단위 테스트 했습니다. 이번에는 DAO Layer를 단위(?) 테스트 하겠습니다.

이번에는 OASF를 사용하여 DBUnit과 spring-mock.jar에 있는 AbstractTransactionalDataSourceSpringContextTests 를 확장한 클래스를 사용하겠습니다. 토비님께서 만드셨는데 DBUnit 사용하기도 좋고 설정파일들의 위치를 특정 컨벤션만 지켜주면 알아서 읽어들입니다.

하지만 제가 테스트 하는 애플리케이션은 OSAF 설정파일들의 컨벤션을 알지 못했기 때문에;; 그냥 getConfigLocations 를 사용해서 필요한 설정 파일들과 테스트 DB를 사용하도록 합니다. 테스트 DB는 java 6에 내장되어 있는 HSQL을 사용합니다.

먼저 테스트용 데이터를 XML 형식으로 준비합니다.

<dataset>
    <member id="1" name="기선" mail="keesun@mail.com" mobile="111-1111-1111" job="BIT" springAtHome="dd" springAtWork="dd" springModules="dd" attendType="N" />
</dataset>

다음 테스트를 작성합니다.

    public void testFindByMail() throws Exception {
        insertFlatXmlDataSet("test/kr/co/springframework/member/dao/memberData.xml");
        Member member = memberDao.findByMail("keesun@mail.com");
        assertNotNull(member);
        assertNull(memberDao.findByMail(""));
    }

테스트가 통과 하도록 findByMail을 구현합니다.

    @SuppressWarnings("unchecked")
    public Member findByMail(final String mail) {
        List<Member> memberList = getHibernateTemplate().executeFind(new HibernateCallback() {
            public Object doInHibernate(Session s) throws HibernateException, SQLException {
                Query q = s.createQuery("from Member m where m.mail = :mail")
                    .setParameter("mail", mail);
                return q.list();
            }
        });
        if(memberList.size() == 0)
            return null;
        else
            return memberList.get(0);
    }

사용자 삽입 이미지
단위 테스트가 끝났습니다. 이제 남은 건
1. Service Layer에서 통합테스트를 해보고
2. Controller Layer에서 통합테스트를 하면

테스트&구현이 끝이납니다. 그럼 톰캣 돌려서 돌려보면 끝이겠지만 지금도 어느정도 잘 돌아갈 것 같은 자신이 생긴 상태입니다. 나머지는 밥먹고..계속 합니다.