Src/main/resources/config/application.ymlを実行するスプリングブートアプリを使用しています。
次の方法でテストケースを実行すると:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}
テストコードは引き続きapplication.ymlファイルを実行してプロパティを読み込みます。テストケースを実行するときに別の* .ymlファイルを実行することは可能かと思います。
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でそれらをオーバーライドします。
src/test/resources/config/application.yml
ファイルでテストプロパティを設定できます。 Spring Bootテストケースは、testディレクトリのapplication.yml
ファイルからプロパティを取得します。
@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"
}
)
これを参照してください: 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;
}
本番application.yml
を完全に置換する必要がある場合は、テストバージョンでテストバージョンを同じパスに配置します(通常はsrc/test/resources/
です)
ただし、一部のプロパティをオーバーライドまたは追加する必要がある場合は、オプションがほとんどありません。
オプション1:@TheKojuEffectが answer で示唆しているように、テストapplication.yml
をsrc/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 に関するドキュメントの詳細を参照してください。
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
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
これはオプションの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;
}
}
使用する単純な作業構成
@TestPropertySourceおよびプロパティ
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {"spring.config.location=classpath:another.yml"})
public class TestClass {
@Test
public void someTest() {
}
}
ユニットテストの実行時に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;
.........