web-dev-qa-db-ja.com

Java Spring Boot Test:除外する方法Javaテストコンテキストから構成クラス

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...が必要な場合.

どうすればいいですか?

11
Sergey

通常、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

11
David Miller

以下のように@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
2
Ondrej Bozek

私が使用する最も簡単な方法-

  1. @ConditionalOnProperty私のメインソースコード。
  2. 次に、テストBeanを定義し、テスト構成の一部として追加します。メインのテストクラスまたはその他の方法でその構成をインポートします。これは、テストBeanを登録する必要がある場合にのみ必要です。そのBeanが必要ない場合は、次の手順に進みます。
  3. Src/test/resourcesの下のapplication.propertiesにプロパティを追加して、メインフォルダーにある構成クラスの使用を無効にします。

出来上がり!

0
Nishant