概要
Spring-BootのJunitテストを作成する際に利用するアノテーションは多種多様であり、覚えきれないし、大量に付与されていると1つ1つ読み解くのが難しい。
そのため、よく利用するものをここでまとめていく。
本文
@ContextConfiguration
指定した@Configration
を付けたクラスをテスト実行時に読み込んでくれる。
任意のBean登録をしたいときに使う。
例)TestConfig.java を読み込ませる場合
@ContextConfiguration(classes = {TestConfig.class})
@ActiveProfiles
@profile("prduciton")
などの記載で、application.ymlで指定したアクティブなプロファイルによってBeanを切り替えることはよくある。ただし、単体テストでapplication.ymlを編集することはできない。
このようなときに利用する。
例) profileをdefault(指定なし)の状態でテストを実行する場合
@ActiveProfiles("")
@TestPropertySource
application.ymlなど外部指定する設定値を置き換える際に利用。
例) app.setting.key1とapp.setting.key2の値を指定してテストしたい場合
@TestPropertySource(
properties = {
"app.setting.key1 = xxxx",
"app.setting.key2 = yyyy"
})
@EnableConfigurationProperties
ymlやpropertiesファイルの値を@ConfigurationProperties
を付与したクラスのフィールドにマッピングさせた場合、このクラスをJunit時に有効にさせるアノテーション。
これを見つけるまで、@ConfigurationPropertiesを付与したクラスのフィールドがNullとなり、苦労した。
例) @ConfigurationPropertiesを付与したAppSetting.javaで外部ファイルの値をマッピングできるようにする場合
@EnableConfigurationProperties(value = AppSetting.class)
@Configuration
@ConfigurationProperties(prefix = "app.setting")
public class AppSetting {
/** app.setting.key1の値. */
private String key1;
/** app.setting.key2の値. */
private String key2;
}
@AutoConfigureMockRestServiceServer
RestTemplateによる通信先のモック化。
これは使い方が結構難して、単体テストで常に使うかどうかは微妙。
@AutoConfigureMockRestServiceServerを付与したうえで、以下のようにすると、RestTemplateによる通信結果を操作できる。
RestTemplate restTemplate = (モック化したRestTemplateオブジェクト);
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer
.expect(requestTo(expectURL)) // モック化したいURL
.andExpect(MockRestRequestMatchers.method(HttpMethod.POST)) // リクエストメソッド
.andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK));//モックによるレスポンス
まとめ
その他お作法のアノテーションも含めて全部つけると以下の状態になる。
これは最低限レベルで、いろいろやろうとするともっと多くなる。
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {TestConfig.class})
@EnableConfigurationProperties(value = AppSetting.class)
@ActiveProfiles("")
@TestPropertySource(
properties = {
"app.setting.key1 = xxxx",
"app.setting.key2 = yyyy"
})
@AutoConfigureMockRestServiceServer
class JunitTest {
}
参考にさせていただいたサイト
- @AutoConfigureMockRestServiceServerについて(解説しているサイトがすくなかったので非常に感謝)
Hatena Blog 日々常々
https://irof.hateblo.jp/entry/2019/07/18/140046