У меня есть два класса интеграционных испытаний.Один из этих классов зависит от bean-компонента, который обращается к внешнему сервису, поэтому мне нужно смоделировать этот bean-компонент, и @MockBean
кажется идеальным для этого.Для введения некоторых семян в БД я использую 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
, как сказано в документации:
Любой существующий одиночный бин того же типа, определенного в контексте, будет заменен на макет.Если существующий бин не определен, будет добавлен новый.Зависимости, которые известны контексту приложения, но не являются компонентами (например, зарегистрированными напрямую), не будут найдены, и фиктивный компонент будет добавлен в контекст вместе с существующей зависимостью.
Это нескажем, что контекст будет воссоздан.