web-dev-qa-db-ja.com

Spring Boot Testで異なるapplication.ymlをロードする

Src/main/resources/config/application.ymlを実行するスプリングブートアプリを使用しています。

次の方法でテストケースを実行すると:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}

テストコードは引き続きapplication.ymlファイルを実行してプロパティを読み込みます。テストケースを実行するときに別の* .ymlファイルを実行することは可能かと思います。

45
Exia

1つのオプションは、プロファイルを操作することです。 application-test.ymlというファイルを作成し、それらのテストに必要なすべてのプロパティをそのファイルに移動してから、テストクラスに@ActiveProfilesアノテーションを追加します。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@ActiveProfiles("test") // Like this
public class MyIntTest{
}

さらに、application-test.ymlをロードするため、application.ymlにあるすべてのプロパティも同様に適用されます。そうしたくない場合は、それらのプロファイルも使用するか、application-test.ymlでそれらをオーバーライドします。

55
g00glen00b

src/test/resources/config/application.ymlファイルでテストプロパティを設定できます。 Spring Bootテストケースは、testディレクトリのapplication.ymlファイルからプロパティを取得します。

17
TheKojuEffect

@TestPropertySourceを使用して、異なるプロパティ/ yamlファイルをロードできます。

@TestPropertySource(locations="classpath:test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class MyIntTest{

}

または、オーバーライド特定のプロパティ/ yamlのみを使用する場合

@TestPropertySource(
        properties = {
                "spring.jpa.hibernate.ddl-auto=validate",
                "liquibase.enabled=false"
        }
)
14
Aman Tuladhar

これを参照してください: YAMLを使用した@PropertySourceの春

3番目の答えにはあなたが探しているものがあると思います、つまり、yaml値をマップするための別のPOJOがあります:

@ConfigurationProperties(path="classpath:/appprops.yml", name="db")
public class DbProperties {
    private String url;
    private String username;
    private String password;
...
}

次に、テストクラスにこれに注釈を付けます。

@EnableConfigurationProperties(DbProperties.class)
public class PropertiesUsingService {

    @Autowired private DbProperties dbProperties;

}
4
Pete

本番application.ymlを完全に置換する必要がある場合は、テストバージョンでテストバージョンを同じパスに配置します(通常はsrc/test/resources/です)

ただし、一部のプロパティをオーバーライドまたは追加する必要がある場合は、オプションがほとんどありません。

オプション1:@TheKojuEffectが answer で示唆しているように、テストapplication.ymlsrc/test/resources/config/ディレクトリに配置します。

オプション2: プロファイル固有のプロパティapplication-test.ymlフォルダーにsay src/test/resources/を作成し、さらに:

  • テストクラスに@ActiveProfiles注釈を追加します。

    @SpringBootTest(classes = Application.class)
    @ActiveProfiles("test")
    public class MyIntTest {
    
  • または、spring.profiles.activeアノテーションで@SpringBootTestプロパティ値を設定します。

    @SpringBootTest(
            properties = ["spring.profiles.active=test"],
            classes = Application.class,
    )
    public class MyIntTest {
    

これは@SpringBootTestだけでなく、@JsonTest@JdbcTests@DataJpaTestおよびその他のスライステストアノテーションでも機能します。

また、必要な数のプロファイルを設定できます(spring.profiles.active=dev,hsqldb)- Profiles に関するドキュメントの詳細を参照してください。

4
Lu55

Spring-bootフレームワークにより、YAMLファイルを提供できます。 。propertiesファイルの置き換えであり、便利です。プロパティファイルのキーは、のYAML形式で提供できます。リソースフォルダー内のapplication.ymlファイルとspring-bootは自動的にそれを使用します。yaml形式では、値が正しく読み取られるようにスペースを正しく保つ必要があることに注意してください。

@Value("${property}")を使用して、YAMLファイルから値を注入できます。また、Spring.active.profilesを指定して、さまざまな環境のさまざまなYAMLを区別して便利な展開を行うことができます。

テスト目的のために、テストyamlファイルはapplicationのような名前にすることができます-test.ymlおよびテストディレクトリのリソースフォルダーに配置されます。

applciation-test.ymlを指定し、ymlでスプリングテストプロファイルを指定する場合、@ActiveProfiles('test')アノテーションを使用して、application-test.yml指定しました。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationTest.class)
@ActiveProfiles("test")
public class MyTest {
 ...
}

JUnit 5を使用している場合、@ SpringBootTestには既にspringrunnerアノテーションが含まれているため、他のアノテーションは不要です。個別のメインApplicationTest.classを保持することで、テスト用に個別の構成クラスを提供できます。また、テストのメインクラスでコンポーネントスキャンから除外することで、デフォルトの構成Beanのロードを防止できます。そこにロードするプロファイルを提供することもできます。

@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class ApplicationTest {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationTest.class, args);
    }
}

.propertiesファイルではなくYAMLの使用に関するSpringドキュメントへのリンクを次に示します。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot -features-external-config.html

3

Spring 4.1以降では、 @ TestPropertySource アノテーションを使用してapplication.ymlのプロパティを直接設定できます。

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = {"yoursection.yourparameter=your_value"})
public MyIntTest
{
 //your test methods
}

Yamlパラメータを完全なプロパティ構造に変換するだけです。例:application.ymlのコンテンツが以下のような場合

yoursection:
  yourparameter:your_value

次に、@ TestPropertySource内に入る値は、

yoursection.yourparameter=your_value
2
girivasan4

これはオプションの1つと考えられます。 ymlファイルをロードしたい場合(上記のアノテーションを適用するとデフォルトではロードされませんでした)、トリックは

@ContextConfiguration(classes= {...}, initializers={ConfigFileApplicationContextInitializer.class})

サンプルコードはこちら

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@DirtiesContext
@ContextConfiguration(classes= {DataSourceTestConfig.class}, initializers = {ConfigFileApplicationContextInitializer.class})
public class CustomDateDeserializerTest {


    private ObjectMapper objMapper;

    @Before
    public void setUp() {
        objMapper = new ObjectMapper();

    }

    @Test
    public void test_dateDeserialization() {

    }
}

再度、セットアップ構成Javaファイル(ここではDataSourceTestConfig.Javaに以下のプロパティー値が含まれていることを確認してください。

@Configuration
@ActiveProfiles("test")
@TestPropertySource(properties = { "spring.config.location=classpath:application-test.yml" })
public class DataSourceTestConfig implements EnvironmentAware {

    private Environment env;

    @Bean
    @Profile("test")
    public DataSource testDs() {
       HikariDataSource ds = new HikariDataSource();

        boolean isAutoCommitEnabled = env.getProperty("spring.datasource.hikari.auto-commit") != null ? Boolean.parseBoolean(env.getProperty("spring.datasource.hikari.auto-commit")):false;
        ds.setAutoCommit(isAutoCommitEnabled);
        // Connection test query is for legacy connections
        //ds.setConnectionInitSql(env.getProperty("spring.datasource.hikari.connection-test-query"));
        ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
        ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        long timeout = env.getProperty("spring.datasource.hikari.idleTimeout") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.idleTimeout")): 40000;
        ds.setIdleTimeout(timeout);
        long maxLifeTime = env.getProperty("spring.datasource.hikari.maxLifetime") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.maxLifetime")): 1800000 ;
        ds.setMaxLifetime(maxLifeTime);
        ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
        ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
        ds.setUsername(env.getProperty("spring.datasource.username"));
        ds.setPassword(env.getProperty("spring.datasource.password"));
        int poolSize = env.getProperty("spring.datasource.hikari.maximum-pool-size") != null ? Integer.parseInt(env.getProperty("spring.datasource.hikari.maximum-pool-size")): 10;
        ds.setMaximumPoolSize(poolSize);

        return ds;
    }

    @Bean
    @Profile("test")
    public JdbcTemplate testJdbctemplate() {
        return new JdbcTemplate(testDs());
    }

    @Bean
    @Profile("test")
    public NamedParameterJdbcTemplate testNamedTemplate() {
        return new NamedParameterJdbcTemplate(testDs());
    }

    @Override
    public void setEnvironment(Environment environment) {
        // TODO Auto-generated method stub
        this.env = environment;
    }
}
1
Joey587

使用する単純な作業構成

@TestPropertySourceおよびプロパティ

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {"spring.config.location=classpath:another.yml"})
public class TestClass {


    @Test

    public void someTest() {
    }
}
0
DHRUV BANSAL

ユニットテストの実行時にsrc\main\Java\com ... henceからymlファイルをロードする@SpringBootTestアノテーションを使用できます。すべてのプロパティは既に構成プロパティクラスにあります。

@RunWith(SpringRunner.class)
@SpringBootTest
public class AddressFieldsTest {

    @InjectMocks
    AddressFieldsValidator addressFieldsValidator;

    @Autowired
    AddressFieldsConfig addressFieldsConfig;
    ...........

    @Before
    public void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(addressFieldsValidator,"addressFieldsConfig", addressFieldsConfig);
    }

}

構成がほとんどない場合は@Valueアノテーションを使用でき、そうでない場合は構成プロパティクラスを使用できます。例えば

@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "address.fields.regex")
public class AddressFieldsConfig {

    private int firstName;
    private int lastName;
    .........
0
denzal