Java Spring BootのWebアプリがあります
テストを実行するとき、いくつかのJava構成ファイルを除外する必要があります。
テスト構成(テスト実行時に含める必要があります):
@TestConfiguration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }
本番構成(テスト実行時に除外する必要があります):
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }
テストクラス(明示的な構成クラスを使用):
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
public class AuthUserServiceTest { .... }
テスト構成:
@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
public class TestAMCApplicationConfig extends AMCApplicationConfig { }
クラスもあります:
@SpringBootApplication
public class AMCApplication { }
テストの実行中にOTPConfig
が使用されているが、TestOTPConfig
...が必要な場合.
どうすればいいですか?
通常、Springプロファイルを使用して、アクティブなプロファイルに応じてSpring Beanを含めたり除外したりします。状況に応じて、プロダクションプロファイルを定義できます。これはデフォルトで有効にできます。およびテストプロファイル。実稼働構成クラスで、実稼働プロファイルを指定します。
@Configuration
@PropertySource("classpath:otp.properties")
@Profile({ "production" })
public class OTPConfig {
}
テスト構成クラスは、テストプロファイルを指定します。
@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
@Profile({ "test" })
public class TestAMCApplicationConfig extends AMCApplicationConfig {
}
次に、テストクラスで、アクティブなプロファイルを指定できるようになります。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
@ActiveProfiles({ "test" })
public class AuthUserServiceTest {
....
}
プロジェクトを実稼働環境で実行する場合、環境変数を設定することにより、「実稼働環境」をデフォルトのアクティブプロファイルとして含めます。
Java_OPTS="-Dspring.profiles.active=production"
もちろん、プロダクションスタートアップスクリプトは、Java_OPTS以外の何かを使用してJava環境変数を設定しますが、どういうわけかspring.profiles.active
。
以下のように@ConditionalOnProperty
を使用することもできます。
@ConditionalOnProperty(value="otpConfig", havingValue="production")
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }
およびテスト用:
@ConditionalOnProperty(value="otpConfig", havingValue="test")
@Configuration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }
main/resources/config/application.yml
で指定するより
otpConfig: production
test/resources/config/application.yml
otpConfig: test
私が使用する最も簡単な方法-
@ConditionalOnProperty
私のメインソースコード。出来上がり!