@MockBeanは、コンテキスト作成を再実行しているようだとafterMigrate.sqlを失敗しました

セルギBishyr:

私は2つの統合テストクラスを持っています。これらのクラスの一つは、私はこのBeanを模擬する必要があるので、外部サービスに話している豆に依存し、@MockBeanこのための完璧なようです。DB Iに、いくつかの種を注入するために使用しているflywayのをafterMigrate.sqlだからここ暑いです、それは次のようになります。

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest
@Transactional
@Rollback
class FooTest {

  @Autowired
  private MyService myService;
}

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest
@Transactional
@Rollback
class BarTest {

  @MockBean
  private ExternalService;

  @Autowired
  private MyService myService;
}

そして、afterMigrate.sql

INSERT INTO my_table (id, name) VALUES (1, 'John Doe')

問題は、私は注釈を付けたときに現れたExternatServiceとして@MockBean、今のようにafretMigrate.sql:二回実行され、私はエラーを取得しています

java.lang.IllegalStateException: Failed to load ApplicationContext
....
Message    : ERROR: duplicate key value violates unique constraint "my_table_pkey"

私は変更していたとき@MockBean@Autowired、エラー何の問題もなく消えて、コンテキストが作成されます。私が実行した場合も、テストは問題なく実行BarTest別途。これがために期待される動作ではありません@MockBeanドキュメントが言うように:

文脈で定義された同じタイプの既存の単一のBeanはモックで置き換えられます。既存のBeanが定義されていない場合は、新しいものが追加されます。アプリケーションコンテキストに知られているが(例えば直接登録もの)豆されないが、依存関係が見つかりませんとモックBeanは、既存の依存関係と一緒にコンテキストに追加されます。

これは、コンテキストが再作成されますことを言っていません。

セルギBishyr:

ここで私は(私は問題を検討)この問題を解決してきた方法です。

解決策1:私が作成したMockConfigものを作成しなければならないことでクラスをmock全体のテストスイートのために:

@Configration
public class MockConfig {

  @Bean
  @Primary
  public ExternalService externalService() {
    return mock(ExternalService.class);
  }
}

そしてテストでは、私は外部サービスをオートワイヤリングています:

@Autowire
private ExternalService externalService;

このソリューションは問題を抱えている。しかし、それはモック豆でそれを上書きします、その後、実際のBeanを作成します。お使いの外部サービス場合は作成時に外部リソースへの接続を行うと、あなたは、あなたが別のソリューションを必要とすることは必要ありません。

解決方法2:で、基本的な抽象クラスを作成し@MockBean、その中に:

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest
@Transactional
@Rollback
public abstract class BaseIntegrationTest {
  @MockBean
  ExternalService externalService;
}

そして、この基本クラスから統合テストを拡張します。

class FooTest extends BaseIntegrationTest {

  @Autowired
  private MyService myService;
}

class BarTest extends BaseIntegrationTest {

  @Autowired
  private MyService myService;
}

それはいつも同じだし、実際のBeanが作成されませんようになりましたコンテキストが更新されません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222710&siteId=1