Junit 정리 - DAO 테스트 하기

web/Junit|2018. 5. 27. 00:46

앞에서 진행했던 컨트롤러, 서비스뿐만 아니라 직접 데이터베이스에 접근하여 쿼리를 사용하는 
DAO 클래스도 Junit 단위 테스트를 진행할 수 있다.

앞에 설명했던 부분들과 마찬가지로 bean 생성을 해야하는데 DAO의 경우에는 dataSource와 sqlSession, mybatis, transaction등 설정해야 하는 부분들이 많다.

이번에는 xml이 아닌 java configuration으로 설정했을 때는 어떻게 설정을 진행해야 하는지 살펴보자.

설정

우선 테스트를 진행하려는 클래스를 bean으로 생성하여야 한다.
DAO 클래스의 경우 sqlSession이 빈으로 생성되어 있어야 생성할 수 있으므로 @DependOn 어노테이션을 사용하여 의존성을 설정해 준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.wedul.wedulpos.user.test;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
 
import com.wedul.wedulpos.user.controller.UserController;
import com.wedul.wedulpos.user.dao.UserDao;
import com.wedul.wedulpos.user.service.UserService;
import com.wedul.wedulpos.user.serviceImpl.UserServiceImpl;
 
/**
 * User 테스트를 위한 Configuration
 * 
 * @author wedul
 *
 */
@Configuration
public class UserTestConfigruation {
    
    @Bean("userController")
    public UserController userController() {
        return new UserController();
    }
    
    @Bean("userService")
    public UserService userService() {
        return new UserServiceImpl();
    }
    
    @Bean("userDao")
    @DependsOn("sqlSession")
    public UserDao userDao() {
        return new UserDao("user");
    }
 
}
cs



그리고 앞서 말했듯이 데이터베이스 접속을 위한 설정을 가지고 올 수 있도록 Configuration 클래스를 작성해 주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.wedul.wedulpos.user;
 
import java.io.IOException;
 
import javax.sql.DataSource;
 
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
 
/**
 * DB 테스트를위한 Configuration
 * 
 * @author wedul
 *
 */
@Configuration
public class CommonTestConfiguration {
 
    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(
                "jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=yes&characterEncoding=UTF8&autoReconnect=true");
        dataSource.setUsername("root");
        dataSource.setPassword("dbsafer00");
 
        return dataSource;
    }
 
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactoryBean sqlSessionFactory(org.springframework.context.ApplicationContext applicationContext,
            DataSource dataSource) throws IOException {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setConfigLocation(applicationContext.getResource("classpath:/mybatis-config.xml"));
        sqlSessionFactory.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml"));
 
        return sqlSessionFactory;
    }
 
    @Bean(name = "sqlSession", destroyMethod = "clearCache")
    public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
 
        return transactionManager;
    }
}
cs




이렇게 하면 기본적인 DAO 클래스 테스트를 위한 설정이 완료되었다.
이제 테스트를 위한 클래스를 작성해보자.

Test 클래스

테스트 클래스는 서비스와 마찬가지로 기본적인 설정이 담긴 Annotation을 먼저 정의한 후, @Before에서 선 작업을 진행하고 @Test에서 테스트를 진행한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.wedul.wedulpos.user.test;
 
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
 
import com.wedul.wedulpos.user.CommonTestConfiguration;
import com.wedul.wedulpos.user.dao.UserDao;
import com.wedul.wedulpos.user.dto.UserDto;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {UserTestConfigruation.class, CommonTestConfiguration.class})
public class UserTest {
    
    
    @Autowired
    UserDao userDao;
    
    UserDto dto;
    
    @Before
    public void setUp() throws Exception {
        dto = new UserDto();
        dto.setId("fasdf");
        dto.setPasswd("dd");
        dto.setName("cjung");
        dto.setEmail("rokking1@naver.com");
        dto.setTel("010-8680-2222");
    }
    
    @Test
    @Transactional
    @Rollback(true)
    public void testUserController() throws Exception {
        userDao.insertUser(dto);
    }
 
}
cs




만약 insert, update, delete와 같은 작업이 동반되어 있는 경우에 롤백을 하고 싶은 경우에는 @Transactional로 트랜잭션을 먼저 설정한 후, @Rollback 어노테이션을 이용해서 롤백을 진행한다고 선언한다.



댓글()

UriComponents 클래스

web/Spring|2016. 12. 27. 00:47

UriComponents 클래스



UriComponents클래스는 Path query 해당하는 문자열들을 추가해서 원하는 URI 생성할 사용한다.

 

UriComponents uricomponets = UriComponentsBuilder.newInstance().path("/board/read").queryParam("bno",12).queryParam("perPageNum", 20).build();


logger.info(uricomponets.toString());



 

다음과 같이 지정하게 되면,

 

INFO : com.wedul.spring.UriComponentsTest - /board/read?bno=12&perPageNum=20


다음과 같이 설정되어 출력된다.

'web > Spring' 카테고리의 다른 글

Mybatis String을 ParameterType으로 넘길때  (0) 2018.05.27
spring에서 List 또는 Array 데이터를 Controller에서 받기  (0) 2018.05.27
UriComponents 클래스  (0) 2016.12.27
Mybatis의 동적 SQL  (0) 2016.12.27
STS의 github 연동  (0) 2016.12.21
Mybatis의 #{} 문법 사용방법  (0) 2016.12.21

댓글()

스프링 프레임워크의 기본적인 구성

web/Spring|2016. 12. 21. 22:22

1. VO 객체
-> 데이터를 담을 객체를 생성

public class BoardVO { 

private Integer bno; 
private String title; 
private String content; 
private String writer; 
private Date regdate; 
private int viewcnt; 

public Integer getBno() { 
return bno; 

public void setBno(Integer bno) { 
this.bno = bno; 

public String getTitle() { 
return title; 

public void setTitle(String title) { 
this.title = title; 

public String getContent() { 
return content; 

public void setContent(String content) { 
this.content = content; 

public String getWriter() { 
return writer; 

public void setWriter(String writer) { 
this.writer = writer; 

public Date getRegdate() { 
return regdate; 

public void setRegdate(Date regdate) { 
this.regdate = regdate; 

public int getViewcnt() { 
return viewcnt; 

public void setViewcnt(int viewcnt) { 
this.viewcnt = viewcnt; 
}

2. DAO 인터페이스
public interface BoardDAO { 

public void create(BoardVO vo) throws Exception; 

public BoardVO read(Integer bno) throws Exception; 

public void update(BoardVO vo) throws Exception; 

public void delete(Integer bno) throws Exception; 

public List<BoardVO> listAll() throws Exception; 


3. DAO 구현 클래스
@Repository 
public class BoardDAOImpl implements BoardDAO { 

@Inject 
private SqlSession session; 

private static String namespace="org.zerock.mapper.BoardMapper"; 

@Override 
public void create(BoardVO vo) throws Exception { 
session.insert(namespace+".create", vo); 


@Override 
public BoardVO read(Integer bno) throws Exception { 
return session.selectOne(namespace+".read", bno); 


@Override 
public void update(BoardVO vo) throws Exception { 
session.update(namespace +".update", vo); 


@Override 
public void delete(Integer bno) throws Exception { 
session.delete(namespace+".delete",bno); 


@Override 
public List<BoardVO> listAll() throws Exception { 
return session.selectList(namespace + ".listAll"); 


}

4. 데이터베이스에 사용할 쿼리를 정리한 mapper xml파일
<mapper namespace="org.zerock.mapper.BoardMapper"> 

<insert id="create"> 
insert into tbl_board(title, content, writer) 
values(#{title}, #{content}, #{writer}) 
</insert> 

<select id="read" resultType="org.zerock.domain.BoardVO"> 
select 
bno, title, content, writer, 
regdate, viewcnt 
from 
tbl_board 
where bno = #{bno} 
</select> 

<update id="update"> 
update tbl_board set title=#{title}, content=#{content} 
where bno=#{bno} 
</update> 

<delete id="delete"> 
delete from tbl_board where bno= #{bno} 
</delete> 

<select id="listAll" resultType="org.zerock.domain.BoardVO"> 
<![CDATA[ 
select  
bno, title, content, writer, regdate, viewcnt 
from  
tbl_board 
where bno > 0 
order by bno desc, regdate desc 
]]> 
</select> 
</mapper>

5. root-context.xml
-> Bean 관리

<!-- 스프링에 빈으로 등록하기, 패키지 자동인식 --> 
<context:component-scan base-package="org.zerock.persistence"></context:component-scan> 

<bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property> 
<property name="url" 
value="jdbc:log4jdbc:mysql://192.168.25.57:3306/book_ex"></property> 
<property name="username" value="root"></property> 
<property name="password" value="ddd00"></property> 
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
<property name="dataSource" ref="dataSource"/> 
<property name="configLocation" value="classpath:/mybatis-config.xml"></property> 
<property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml"></property> 
</bean> 

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache"> 
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg> 
</bean> 
</beans>

6. 테스트 클래스
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/*.xml"}) 
public class BoardDAOTest { 
private static final Logger logger= LoggerFactory.getLogger(BoardDAOTest.class); 

@Inject //BoardDAO에 대한 의존성 주입 
private BoardDAO dao; 

@Test // 글 생성 테스트 
public void testCreate() throws Exception { 
BoardVO board = new BoardVO(); 
board.setTitle("input the new Text"); 
board.setContent("input the new Text Content"); 
board.setWriter("user00"); 
dao.create(board); 


@Test 
public void testRead() throws Exception { 
logger.info(dao.read(1).toString()); 


@Test 
public void testUpdate() throws Exception { 
BoardVO board = new BoardVO(); 
board.setBno(1); 
board.setTitle("Update Title"); 
board.setContent("Update Content"); 
dao.update(board); 


@Test 
public void testDelete() throws Exception { 
dao.delete(1); 
}

출처 
남가람북스
코드로 배우는 스프링 웹 프레임워크

'web > Spring' 카테고리의 다른 글

STS의 github 연동  (0) 2016.12.21
Mybatis의 #{} 문법 사용방법  (0) 2016.12.21
Spring의 UTF-8 처리 필터 등록  (0) 2016.12.21
스프링 프레임워크의 기본적인 구성  (0) 2016.12.21
Mybatis 관련 정리  (0) 2016.12.21
typeAliases 사용방법  (0) 2016.12.21

댓글()