web-dev-qa-db-ja.com

'application.yml'のSpring BootプロパティがJUnit Testからロードされない

私は何を間違えていますか?私は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 {
    ...
}
35
aliopi

これを試して:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
    ...
}

編集

Spring Bootバージョン1.5+の場合、SpringApplicationConfigurationを支持してSpringBootTestが削除されたか、SpringBootContextLoaderが直接使用されました。

initializersアノテーションでContextConfigurationパラメーターを引き続き使用できます。

35
luboskrnac

別の方法を次に示します。[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 [実際の設定ファイルはこちら]

8
Juha Hanka

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 {
8
aliopi

@SpringBootTestを使用せずにSpringBoot 2.0でカスタムymlファイルを読み込むanyトリック

  • test\resourcesにymlファイルを作成します
  • 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.

}
7
Yarix

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 {...}
3
Liam

私の場合、通常のアプリクラスパスで@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>
1
Lyle

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) -> {

        .....

    });
}
0
Ritesh