バージョン
- SprintBoot ... 2.1.9.RELEASE
仕組み
@SpringBootTest アノテーションはテスト実行時のコンフィグレーションクラスを自動検出する機能を備えています。SpringBootを使わない場合には @ContextConfiguration でコンフィグレーションを明示する必要があるわけですがそれが不要になるわけです。
自動検出されるのは @SpringBootConfiguration がついたクラスです。このアノテーションは @Configuration と同じ意味ですが @SpringBootTest によって自動的にテストコンフィグレーションに設定されるという点で挙動が異なります。
@SpringBootApplication アノテーションには @SpringBootConfiguration のアノテーションがついているので、 @SpringBootTest アノテーションは @SpringBootApplication のクラスをテストのコンフィグレーションとして設定するわけです。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public UserRepository userRepository() {
return new InMemoryUserRepository();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserRepository userRepository; // InMemoryUserRepositoryがインジェクションされる
}
自動検出からテスト用のコンフィグレーションクラスを除外
しかし、特定のテストのためにコンフィグレーションを作成する場合もあります。このコンフィグレーションクラスが自動検出されてしまうと意図していないコンフィグレーションが設定されてしまうことになります。
@Configuration
public class SpecificTestConfiguration {
@Bean
public UserRepository hsqlUserRepository() {
return new HSQLUserRepository();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private UserRepository hsqlUserRepository;
@Test
public void check() {
assertThat(hsqlUserRepository).isInstanceOf(HSQLUserRepository.class);
}
}
このような場合は @TestConfiguration を使用し自動検出の対象外としてコンフィグレーションクラスをマークしましす。コンフィグレーションを読み込みたい場合は @Import を使って読み込みます。
@TestConfiguration
public class SpecificTestConfiguration {
@Bean
public UserRepository hsqlUserRepository() {
return new HSQLUserRepository();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@Import(SpecificTestConfiguration.class)
public class DemoApplicationHsqlTests {
@Autowired
private UserRepository hsqlUserRepository;
@Test
public void check() {
assertThat(hsqlUserRepository).isInstanceOf(HSQLUserRepository.class);
}
}