토이 프로젝트를 하는 도중, 멀티모듈 환경을 구성하고 테스트를 하려는데 에러가 발생했다.
에러코드들을 공통코드 테이블에 집어넣고 DB에서 가져와서 초기에 Application이 실행될때 메모리에 가지고 있다가 exception이 날때마다 해당 에러코드를 메모리에서 가져와서 바로바로 사용하는 기능을 구현 중이었다.
테스트 코드를 작성하던 도중 다음과 같은 오류를 만났다.

구글링을 해본 결과 한 벨로그에서 정리를 잘 해주셨다.
멀티모듈 프로젝트는 SpringBootApplication을 모듈에 넣어놓고 테스트를 진행하는데 이게 없어서 에러가 났던 것이다.

이렇게 @SpringBootApplication을 모듈 안에 넣어준 후 테스트를 하니 정상적으로 작동하였다.
반대로 단위 테스트를 진행할 때는 Mock를 사용하여 실행을 했는데, 여기서 Mock랑 SpringBootTest의 차이점을 찾았다.
@SpringBootTest와 같은 테스트에서는 실제로 스프링 애플리케이션 컨텍스트를 로드한다. 이 경우 테스트할 때 해당 애플리케이션 컨텍스트의 설정이 필요하기 때문에 @SpringBootApplication이 있는 클래스를 지정해주어야 한다.
하지만, Mockito와 같은 단위 테스트를 수행할 때는 전체 애플리케이션 컨텍스트를 로드할 필요가 없다. 이 경우 테스트하고자 하는 특정 클래스에 대한 단위 테스트를 수행하며, 해당 클래스의 의존성을 Mocking하는 것이 목적이다. 따라서, 단위 테스트에서는 @SpringBootApplication 클래스를 지정할 필요가 없다.
[1] 컨텍스트 로딩: 스프링 애플리케이션 컨텍스트를 로드하고 모든 빈을 초기화한다.
[2] 테스트 대상: 통합 테스트 또는 여러 빈 사이의 상호작용을 테스트할 때 사용한다.
[3] 필요사항: @SpringBootApplication이 있는 클래스를 지정해야 하며, 멀티 모듈 프로젝트에서는 해당 모듈의 애플리케이션 클래스를 지정해줘야 할 수 있다.
[1] 컨텍스트 로딩: 스프링 컨텍스트를 로드하지 않으며, 특정 클래스의 의존성을 Mocking하여 단위 테스트를 수행한다.
[2] 테스트 대상: 개별 클래스나 메서드의 동작을 검증하는 데 초점이 맞춰져 있다.
[3] @SpringBootApplication 클래스를 지정할 필요가 없으며, 단순히 필요한 의존성만 Mocking하면 된다.
class ComnErrorCodeListInitTest {
@Mock
private ComnErrorCodeDaoMapper comnErrorCodeDaoMapper;
@InjectMocks
private ComnErrorCodeListInit comnErrorCodeListInit;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void testInitEntities() {
// Given
ErrorCodeEntity duplicateGroupErrCode = new ErrorCodeEntity();
duplicateGroupErrCode.setErrorCode("EC_G_001");
ErrorCodeEntity notFoundGroupErrCode = new ErrorCodeEntity();
notFoundGroupErrCode.setErrorCode("EC_G_002");
ErrorCodeEntity duplicateIdErrCode = new ErrorCodeEntity();
duplicateIdErrCode.setErrorCode("EC_A_001");
List<ErrorCodeEntity> errorCodeEntities = Arrays.asList(
duplicateGroupErrCode,
notFoundGroupErrCode,
duplicateIdErrCode
);
// When
when(comnErrorCodeDaoMapper.getErrorCodes(new ErrorCodeEntity())).thenReturn(errorCodeEntities);
comnErrorCodeListInit.initOptionData();
// Then
List<ErrorCodeEntity> result = comnErrorCodeListInit.getErrorCodeEntities();
assertEquals(4, result.size());
assertEquals("EC_G_001", result.get(0).getErrorCode());
assertEquals("EC_G_002", result.get(1).getErrorCode());
assertEquals("EC_A_001", result.get(2).getErrorCode());
}
}

에러코드 몇개만 가지고 와봤다.
결과는 성공 !
다음에는 공통코드에서 에러코드가 DB에 추가되었을때, 동기화하는 기능을 구현할 예정이다.