test에서만 사용하는 bean 생성 방법
@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
})
}
}
}
}