私は何を間違えていますか?私はsrc/main/resources/config/application.yml
を実行して見つけるこの小さなスタンドアロンアプリを使用しています。同じ構成は、JUnitでは機能しません。以下を参照してください。
@Configuration
@ComponentScan
@EnableConfigurationProperties
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class);
}
}
@Component
@ConfigurationProperties
public class Bean{
...
}
以下は機能しません。application.yml
の同じプロパティは読み込まれず、Bean
にはnull
の値しかありません。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)
public class SomeTestClass {
...
}
これを試して:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class,
initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
...
}
編集:
Spring Bootバージョン1.5+の場合、SpringApplicationConfiguration
を支持してSpringBootTest
が削除されたか、SpringBootContextLoader
が直接使用されました。
initializers
アノテーションでContextConfiguration
パラメーターを引き続き使用できます。
別の方法を次に示します。[Spring Boot v1.4.x]
@Configuration
@ConfigurationProperties(prefix = "own")
public class OwnSettings {
private String name;
Getter & setters...
}
import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public class OwnSettingsTest {
@Autowired
private OwnSettings bean;
@Test
public void test() {
bean.getName();
}
}
「application.properties」ファイルも存在する場合のみ機能します。
例:mavenプロジェクト:
src/main/resources/application.properties [ファイルは空でもかまいませんが必須です!]
src/main/resources/application.yml [実際の設定ファイルはこちら]
2017年2月の代替案:
@SpringBootTest
@ContextConfiguration(classes = { TestApplication.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
...
}
リーンバリアント(@SpringBootTest
なし):
@ContextConfiguration(classes = { TestApplication.class },
initializers = { ConfigFileApplicationContextInitializer.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
@SpringBootTest
を使用せずにSpringBoot 2.0でカスタムymlファイルを読み込むanyトリック
ConfigFileApplicationContextInitializer
およびspring.config.location
プロパティを使用しますサンプルコード:
@RunWith(SpringRunner.class)
@ContextConfiguration(
classes = { MyConfiguration.class, AnotherDependancy.class },
initializers = {ConfigFileApplicationContextInitializer.class} )
@TestPropertySource(properties = { "spring.config.location=classpath:myApp-test.yml" })
public class ConfigProviderTest {
@Autowired
private MyConfiguration myConfiguration; //this will be filled with myApp-test.yml
@Value("${my.config-yml-string}")
private String someSrting; //will get value from the yml file.
}
Spring Boot 2を使用した単体テスト
spring boot 2はデフォルトで「application.properties」をサポートします。「application.yml」の場合は以下を追加するだけです。
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
例えば.
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
public class ServiceTest {...}
私の場合、通常のアプリクラスパスで@SpringBootApp
を宣言せずにライブラリをテストしようとしましたが、テストコンテキストにライブラリがあります。 Spring Bootの初期化プロセスをデバッグした後、Spring Bootの YamlPropertySourceLoader (1.5.2.RELEASE時点)は、org.yaml.snakeyaml.Yaml
がクラスパスにない限り、YAMLプロパティをロードしないことを発見しました。私にとっての解決策は、私のPOMにテストの依存関係としてsnakeyamlを追加することでした:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.19</version>
<scope>test</scope>
</dependency>
Spring boot 2の例:
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withInitializer(new ConfigFileApplicationContextInitializer());
@Test public void test() throws Exception {
this.contextRunner
.withUserConfiguration(TestApplication.class)
.run((context) -> {
.....
});
}