본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA/Spring

DbUnit 테스트: dataSource를 불러와 insert/select 확인하기

앞서 EasyMock을 통한 테스트를 진행해봤다.

https://standout.tistory.com/1144

 

EasyMock + JUnit 테스트 @Before @Test

앞서 JUnit테스트를 진행해봤다. https://standout.tistory.com/1139 JUnit 테스트 : @Before @After @Test 간단한 JUnit 테스트를 진행해보자. https://standout.tistory.com/378 junit 4.7 이란? 단위테스트 프레임워크, 코드수

standout.tistory.com

 

 

앞선 테스트에서 아래와같이 VO를 SET하여 실행하였다.

sampleService = mock(EgovSampleService.class);
//SampleVO 객체를 생성하고 이름을 설정한다.
        SampleVO mockSampleVO = new SampleVO();
        mockSampleVO.setName("Sanghee");

 

SERVICE 클래스를 MOCK으로 생성해 사용하며

데이터베이스 상태에 의존적이 되지않지만 selectSample메소드를 실행하기위해

DELETE, INSERT등 메소드가 포함되어있는 CLASS자체를 가져왔기때문에

외 메소드에 문제점이 있으면 실패할 수 있는 테스트의 여지가 있다

 

하나의 메소드를 위한 테스트 케이스가 다른 메소드들의 상태에 따라

성공여부가 변하게 된다면 단위테스트라는 의미는 모호해지게 된다.

 

이 문제점을 해결할 수 있는 라이브러리 DbUnit을 경험해보자.

DbUnit는 DAO를 대신하여 데이터 삽입/조회/수정/삭제를 한다.

 

 

 

우선 기존 db.sql을 확인하여

적절히 table과 필드에 저장할 값을 아래와같은 형식으로 작성해놓자.

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <!-- 테이블 'SAMPLE'에 대한 데이터 -->
    <SAMPLE ID="1" NAME="John" DESCRIPTION="Description 1" USE_YN="Y" REG_USER="user1"/>
    <SAMPLE ID="2" NAME="Jane" DESCRIPTION="Description 2" USE_YN="N" REG_USER="user2"/>
    <!-- 다른 테이블에 대한 데이터도 필요하다면 추가할 수 있습니다. -->
</dataset>

 

 

 

 

시작하기 앞서 dbunit과 spring-test 의존성을 추가하자.

<dependency>
    <groupId>org.dbunit</groupId>
    <artifactId>dbunit</artifactId>
    <version>2.7.0</version> <!-- 사용 중인 버전에 맞게 변경하세요 -->
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.3.10</version> <!-- Use the version compatible with your Spring version -->
    <scope>test</scope>
</dependency>

 

 

 

DB설정이 담겨있는 파일을 가져와 대입해보자.

ontext-datasource.xml을 가져다 @ContextConfigureation을 통해 파일을 이용한 Spring context로 로드해

@Autowired BEAN 설정.

 

 

이 dataSource는 커넥션시 사용된다.

현상태에서 굳이 필요능 없으나, 데이터의 일관성을 유지하기 위해 추가로

DatabaseConfig설정을 통해 테이블 이름의 대소문자 구분이 가능하도록도 지정해보자.

//SpringRunner를 사용하여 테스트를 실행합니다.
//파일을 사용하여 Spring 컨텍스트를 로드합니다
@RunWith(SpringRunner.class)
@ContextConfiguration(locations = { "classpath:egovframework/spring/context-datasource.xml" })
public class DbUnitTest extends DBTestCase {

    @Autowired //dataSource를 자동으로 주입받습니다.
    private DataSource dataSource;
    protected DataSource getDataSource() {
        return dataSource;
    }


    public DbUnitTest() {
        super();
    }

    //dataSource에서 Connection을 가져와 DatabaseConnection 객체를 생성합니다.
    protected DatabaseConnection createDbUnitConnection() throws Exception {
        Connection connection = DataSourceUtils.getConnection(getDataSource());
        DatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
        
        //DatabaseConfig를 사용하여 테이블 이름의 대소문자 구분 기능을 설정합니다.
        DatabaseConfig dbConfig = dbUnitConnection.getConfig();
        dbConfig.setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, true);
        return dbUnitConnection;
    }

}

 

 

 

 

 

작성했던 xml 소스를 IDataSet객체로 생성해 초기 데이터베이스에 반영한뒤

 //sangheeDB.xml 파일을 읽어와 IDataSet 객체를 생성하여 반환합니다.
    @Override 
    protected IDataSet getDataSet() throws Exception {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("sangheeDB.xml");
        return new FlatXmlDataSetBuilder().build(inputStream);
    }


    //데이터베이스 연결을 테스트
    @Test
    public void testDatabaseConnection() throws Exception {
        // Arrange: 데이터베이스 연결 및 초기 상태를 설정
    	//IDataSet 객체를 가져와 초기 데이터셋을 데이터베이스에 반영합니다.
        IDataSet dataSet = getDataSet();
        String tableName = "SAMPLE";  // 테이블 이름을 확인하세요.

        // Act: CLEAN_INSERT 연산을 사용하여 초기 데이터셋을 데이터베이스에 반영
        DatabaseOperation.CLEAN_INSERT.execute(createDbUnitConnection(), dataSet);

        // Assert
        //데이터베이스 연결이 정상적으로 이루어졌는지 확인합니다.
        assertNotNull(createDbUnitConnection());
        
    }

 

 

 

 

이를 출력하는 함수를 작성해 출력결과를 확인해보자.

  
        //printTableData() 메서드를 호출하여 특정 테이블의 데이터를 출력합니다.
        printTableData(tableName);
 //특정 테이블의 데이터를 조회하는 메서드
    private void printTableData(String tableName) throws Exception {
    	//특정 테이블의 데이터 조회 쿼리를 생성합니다.
        String selectQuery = "SELECT * FROM " + tableName;

        // 데이터베이스 연결
        Connection connection = createDbUnitConnection().getConnection();

        try (Statement statement = connection.createStatement();
             ResultSet resultSet = statement.executeQuery(selectQuery)) {

            // 결과 출력
            System.out.println("Data in table " + tableName + ":");
            while (resultSet.next()) {
                System.out.println(resultSet.getString("ID") + ", "
                        + resultSet.getString("NAME") + ", "
                        + resultSet.getString("DESCRIPTION") + ", "
                        + resultSet.getString("USE_YN") + ", "
                        + resultSet.getString("REG_USER"));
            }
        }
    }

 

 

 

 

완료.