멀티 모듈로 @DataJpaTest 진행할때 오류

멀티 모듈로 @DataJpaTest 진행할때 오류

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test

멀티 모듈에서 실제 @SpringBootApplication 같은 Spring Context를 로드 하는 부분이 없어서 인데 이부분은 test코드에서 아래처럼 로드 하는 부분을 만들어 주면 된다.

1
2
3
4
5
6

@SpringBootApplication
public class ApplicationTests {
public void contextLoads() {}
}

별도의 DataSourceConfiguration 불러오기

@Import 어너테이션을 사용해서 로드

1
2
3
4
5
6
7

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(DataSourceConfiguration.class)
public class RepositoryTest {
}

The dependencies of some of the beans in the application context form a cycle

위에 내용은 순환 참조 내용인데 Bean 등록시 @DependsOn 을 할용해서 Bean들 간에 의존성을 정해주면 해결된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


@Configuration
public class DataSourceConfiguration {

@Bean
@ConfigurationProperties(prefix = "test.datasource-read")
public DataSource readDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

@Bean
@ConfigurationProperties(prefix = "test.datasource-write")
public DataSource writeDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

@DependsOn({"readDataSource","writeDataSource"})
@Bean
public DataSource routingDataSource(@Qualifier("writeDataSource") DataSource writeDataSource,
@Qualifier("readDataSource") DataSource readDataSource) {

ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("write", writeDataSource);
dataSourceMap.put("read", readDataSource);
routingDataSource.setTargetDataSources(dataSourceMap);
routingDataSource.setDefaultTargetDataSource(readDataSource);

return routingDataSource;
}

@DependsOn("routingDataSource")
@Primary
@Bean
public DataSource dataSource(@Qualifier("routingDataSource") DataSource routingDataSource) {
return new LazyConnectionDataSourceProxy(routingDataSource);
}
}

테스트시에 실제 DB로 테스트 하기

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 어너테이션을 활용하면 설정정보가 임베디드디비로 맴핑되는것을 방지할수있다.

참고자료