私は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は、既存の依存関係と一緒にコンテキストに追加されます。
これは、コンテキストが再作成されますことを言っていません。
ここで私は(私は問題を検討)この問題を解決してきた方法です。
解決策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が作成されませんようになりましたコンテキストが更新されません。