junit test 내부 class에 bean 추가해서 테스트 하는 방법

jaycee·2023년 11월 30일

goal

test에서만 사용하는 bean 생성 방법

summary

@TestConfiguration을 시용한다.

절차 및 코드

코틀린 기준 (자바도 대동소이함)

새로운 스프링 어플리케이션을 개발하면서 mainDatabase라는 db 접속 세팅이 잘 됐는지 확인하려고 했다.

단순 resultset만 가져오는 테스트 코드를 작성하는 도중 jdbcTemplate bean 생성이 필요했으나 운영 소스에는 필요가 없어 테스트 환경 내에서만 @bean생성이 필요했다.

이럴 때는 @TestConfiguration를 선언한 내부 클래스를 생성하고 내부 클래스에서 @Bean을 선언해준다.

생성된 Bean은 의존성 주입을 받는데 내부 클래스의 bean에서 받으므로 외부 클래스에서 import받는 것이 아니라

@Autowired
private lateinit var commonCodeRepository: TestConfig.CommonCodeRepository 

import를 사용하지 않고 직접 주입받는다.

아래는 이를 적용한 전체 코드

@SpringBootTest
class MyApplicationTests {

    @Autowired
    private lateinit var commonCodeRepository: TestConfig.CommonCodeRepository

    @Test
    fun contextLoads() {
        val result = CommonCodeRepository.findAll()

        // 결과 출력
        result.forEach { rowMap ->
            rowMap.forEach { (columnName, columnValue) ->
                println("$columnName: $columnValue")
            }
            println("--------------------")
        }
    }

    @TestConfiguration
    class TestConfig {

        @Bean
        fun jdbcTemplate(@Qualifier("mainDataSource") dataSource: DataSource): JdbcTemplate {
            return JdbcTemplate(dataSource)
        }

        @Repository
        class CommonCodeRepository(@Autowired private val jdbcTemplate: JdbcTemplate) {

            fun findAll(): MutableList<MutableMap<String, Any>> {
                val sql = "SELECT * FROM common_code"

                return jdbcTemplate.query(sql, RowMapper { rs: ResultSet, _ ->
                    val metaData = rs.metaData
                    val columnCount = metaData.columnCount
                    val rowMap = mutableMapOf<String, Any>()

                    for (i in 1..columnCount) {
                        val columnName = metaData.getColumnName(i)
                        val columnValue = rs.getObject(i)
                        rowMap[columnName] = columnValue?:"aaa"
                    }

                    rowMap
                })
            }
        }
    }

}
profile
오늘도 하나 배웠다.

0개의 댓글