web-dev-qa-db-ja.com

スプリングブートテスト:すべてのテストでコンテキストがロードされましたか?

私のプロジェクトには、すべてのテスト用のスーパークラスがあります。これはそのクラスの署名です

@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {

Application.classがメインクラスであり、SomeConfiguration.classが@Beanやその他のもののためだけのものです。

私はgradleを使用し、テストを実行するために次のことを行います

./gradlew :my-project:test

私の問題は:

  • 各テストでコンテキストが初期化されているかどうかはわかりません。しかし、コンテキストが複数回初期化されることを保証できます。私はログを見ることでこれを知っています。
  • 複数のコンテキストが初期化されているため、コンテキストは互いに重複しているようです。症状の1つがこの例外であるため、これを知っています。

    Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
    
  • ロードされている複数のコンテキストを気にしなくても、テストが終了すると、前のコンテキストが終了する前に次のテストが新しいコンテキストを取得するという印象です。これは、上からの例外が重複しているためです。

すべてのテストが同じJVMを共有するため、一部のBeanが2回登録されると、その例外が発生します。このリンクから:

コンテキストキャッシュ

と言われている:

ApplicationContextは、ロードに使用される構成パラメーターの組み合わせによって一意に識別できます。したがって、構成パラメーターの一意の組み合わせを使用して、コンテキストがキャッシュされるキーを生成します。 TestContextフレームワークは、次の構成パラメーターを使用してコンテキストキャッシュキーを構築します

私はそれを理解していますが、どうすればそれを達成できますか?私の目標は、すべてのテストを同じJVMで実行し、すべてのテストでコンテキストを再利用することです。

2月22日(木)に編集

私が試したもの:

  • spring.jmx.enabled:false
  • spring.jmx.default-domain:いくつかの値

JMXを実際に無効にすることは、Spring CloudからのEnvironmentManagerの周辺に例外があるため、役に立たないはずです。

5
Perimosh

私は私の問題に対する答えを見つけました。以下に説明があります。

https://github.com/spring-projects/spring-boot/issues/7174

基本的に、多数のテストを実行する場合、そのうちの1つが開始されるとすぐに、アノテーション@MockBeanを使用すると、Springにコンテキストの再ロードが強制されます。

ボーナス:テストでorg.mockito.Mockを使用すると、同じ動作が見られます。

6
Perimosh