앞서 EasyMock을 통한 테스트를 진행해봤다.
https://standout.tistory.com/1144
앞선 테스트에서 아래와같이 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"));
}
}
}
완료.
'JAVA > Spring' 카테고리의 다른 글
Controller에서 간단하게 DB 테스트 하기: jdbcTemplate.queryForObject (0) | 2024.07.29 |
---|---|
@Transactional Spring 트랜젝션, 실패시 되돌리다 (0) | 2023.12.26 |
EasyMock + JUnit 테스트 @Before @Test (0) | 2023.11.30 |
JUnit 테스트 : @Before @After @Test (0) | 2023.11.29 |
MVC패턴 게시판 구현하기: 페이징 (0) | 2023.11.28 |