앞에서 진행했던 컨트롤러, 서비스뿐만 아니라 직접 데이터베이스에 접근하여 쿼리를 사용하는 
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 어노테이션을 이용해서 롤백을 진행한다고 선언한다.



+ Recent posts