Spring Boot 프레임워크에서 Test 파일을 작성하다보면 다음과 같은 어노테이션을 붙여서 작성하곤 한다.
@SpringBootTest
하지만 해당 어노테이션은 프로젝트 내에서 선언하거나 사용하고 있는 Spring Context를 모두 IoC에 등록하기 때문에 비용 및 시간이 많이 소모 된다.
통합 테스트 시나리오에서는 적절할지 모르겠으나 Repository 또는 DB간 트랜잭션 단위 또는 서비스 레이어 내에서의 단위 테스트에는 적절하지 않다고 생각한다.
이에 이번에 Repository 테스트 즉 MongoDB 조회를 하는 단위테스트 작성 및 정리하고자 한다.
1. @SpringBootTest 사용하기
우선 SpringBootTest 어노테이션을 붙여 테스트 진행시 Spring Context를 전부 불러오는 테스트를 진행하고자 한다.
@EnableAutoConfiguration
@SpringBootTest
public class MongoDBContextTest {
@Autowired
MongoTemplate mongoTemplate;
@Test
@DisplayName(value = "SpringBootTest 모두 등록하기 - MongoDB Test")
public void springContextMongoTest() {
Query query = Query.query(Criteria.where("baseId").is("juer"));
BaseDocument baseDocuments = mongoTemplate.findOne(query, BaseDocument.class);
Assertions.assertThat(baseDocuments).extracting("baseName").isEqualTo("희희");
}
}
보통 실무에서 개발 시 로컬 / 개발/ 운영에 따라 ${test}/config/test JVM Argument를 따로 설정하거나 .yml 값들을 설정을 따로 하는 경우가 있다.
이에 SpringBootContex 사용시에는 모든 Context 값들을 불러오기 때문에
static {
System.getProperties().setProperty("url", "192.168.0.1");
System.getProperties().setProperty("myname", "erer");
}
과 같은 설정을 @BeforeEach 메소드 안에 넣어야 하는 경우도 생긴다. 이는 다른 Service layer에도 영향을 줄 수 있고 해당 Service 값 또한 주입 받아 사용해야 하기 때문에 단위 테스트가 아닌 통합 테스트 형태의 테스트가 진행 된다
2. MongoTemplate를 Custom하기
@SpringJUnitConfig(TestConfig.class) // TestConfig 등록
@EnableAutoConfiguration
@DataMongoTest
public class MongoDBTest {
@Autowired
@Qualifier("testMongoTemplate") // TestConfig 클래스내 선언된 "testMongoTemplate" 빈 정보 가져오기
private MongoTemplate mongoTemplate;
@Test
@DisplayName(value = "mongoTemplate Custom 빈 등록하기 - MongoDB Test")
public void baseNmTest() {
Query query = Query.query(Criteria.where("baseId").is("juer"));
BaseDocument baseDocuments = mongoTemplate.findOne(query, BaseDocument.class);
Assertions.assertThat(baseDocuments).extracting("baseName").isEqualTo("희희");
}
}
@Configuration(proxyBeanMethods = false)
class TestConfig {
@Bean("testMongoTemplate") // testMongoTemplate Bean 설정 및 선언하기
public MongoTemplate mongoTemplateConfig() {
MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");
return new MongoTemplate(mongoClient, "mser");
}
}
단위테스트의 가장 중요한 점은 해당 테스트가 다른 테스트에 영향을 끼치지 말아야 하며 독립적인 테스트가 진행되어야 한다.
이에 MongoDB 조회간 필요한 context 및 필요한 메소드는 오직 MongoTemplate 정보이기 때문에 기존 Spring에서 정의된 MongoTemplate를 사용하여 Spring 전체의 Context정보를 불러오는 것이 아닌
개발자가 MongoTemplate 정보를 커스텀해서 사용한다면 타 테스트 영향을 주지 않고 테스트를 진행 할 수 있다.
해당 로그를 보면 MongoDB와의 커넥션을 열고 조회하는 로그만 존재하는 것을 확인 할 수 있다.
끝.
'개발 지식 > Spring Framework' 카테고리의 다른 글
[Spring] 구글 smtp 서버를 활용한 메일 보내기 (1) | 2023.01.15 |
---|---|
[Reactive Mongo] Reactive MongoDB QueryDSL 버전 충돌 (0) | 2022.08.22 |
[Spring] SpringBoot + WebFlux + Kotlin + ReactiveMongo 프로젝트 생성 (1) | 2022.05.01 |
[Test] Controller Test mockMvc 활용 (0) | 2022.04.26 |
[thymeleaf] 기본 기능 정리 - 01 (0) | 2021.12.16 |
댓글