私はSpringBootフレームワークとマルチモジュールのMavenプロジェクトに取り組んでいます。残りのモジュール、サービスモジュール、リポジトリモジュール、ドメインモジュール:プロジェクトは、4つのモジュールに分割されます。私は、サービスモジュールに配置されているJavaでの構成クラスのユニットテストを記述しようとしています。私は、ビジネスロジックの複雑さを取り除くためにケースを単純化してきました。コンフィギュレーション・クラスは、以下のようなものです:
@Configuration
@ConfigurationProperties(prefix = "x.y.feature", ignoreInvalidFields = false)
public class FeatureConfig {
private String featureUrl;
public String getFeatureUrl() {
return featureUrl;
}
public void setFeatureUrl(String FeatureUrl) {
this.featureUrl = featureUrl;
}
}
プロパティファイルがapplication.propertiesです。
x.y.feature.featureUrl=featureUrl
そして、以下の作業をされていないユニットテストです。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { FeatureConfigTest.class })
public class FeatureConfigTest {
@Autowired
private FeatureConfig featureConfig;
@Test
public void testgetFeatureUrl() {
String expected ="featureUrl";
assertEquals(expected,featureConfig.getFeatureUrl());
}
}
私はユニットテストを実行すると、以下の例外がスローされます。
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
問題は、アプリケーションコンテキストからFeatureConfigのオブジェクトを使用しようとしているということです。あなたは、アプリケーション・コンテキストを初期化していません。あなたは@Autowireアノテーションを使用するときは、アプリケーションコンテキストにあるタイプFeatureConfigクラスのインスタンスを持つフィールド「featureConfig」をマッピングしています。このエラーバイパスするには、アプリケーション・コンテキストを初期化する必要が。
まず最初は、全体のアプリケーションコンテキストをロードしないように私たちを助けるテストクラス内の静的クラスを作成します。このため、テストケースのためにあなたは、アプリケーション全体をロードする必要はありません。まず最初は、全体のアプリケーションコンテキストをロードしないように私たちを助けるテストクラス内の静的クラスを作成します。このため、テストケースのためにあなたは、アプリケーション全体をロードする必要はありません。
@EnableConfigurationProperties(FeatureConfig.class)
public static class TestConfiguration {
}
その後、あなたはしかし、設定として作成した静的クラスを渡すことで、アプリケーション・コンテキストを開始します。これは、アプリケーション全体のコンテキストをロードしないように行われます。
@SpringBootTest(classes = { FeatureConfigTest.TestConfiguration class })
コピーは、あなたのテストクラスに以下の変更を貼り付けると、すべてが正常に動作する必要があります。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { FeatureConfigTest.TestConfiguration class })
public class FeatureConfigTest {
@Autowired
private FeatureConfig featureConfig;
@Test
public void testgetFeatureUrl() {
String expected ="featureUrl";
assertEquals(expected,featureConfig.getFeatureUrl());
}
@EnableConfigurationProperties(FeatureConfig.class)
public static class TestConfiguration {
}
}