У меня есть несколько интеграционных тестов, запущенных на Spring Framework, которые расширяют базовый класс под названием BaseITCase.
Примерно так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppCacheConfiguration.class, TestConfiguration.class}, loader = SpringBootContextLoader.class)
@Transactional
@WebMvcTest
public abstract class BaseITCase{...}
...
public class UserControllerTest extends BaseITCase {...}
Проблема в том, что в одном из тестов есть несколько объявлений: @MockBean внутри, и в момент выполнения этого теста Spring воссоздает контекст, а тесты, следующие за этим, иногда используют неправильные bean-компоненты (из контекста, созданного именно для теста с помощью @ MockBean). Я узнал об этом, просто проверив, что у bean-компонентов разные хэш-коды.
Когда я использую @EventListener, это становится действительно критичным. Потому что вызываются слушатели для неправильного контекста (контекст тестового класса, который уже завершил выполнение), и у меня там неправильные bean-компоненты.
Есть ли обходной путь для этого?
Я попытался переместить все объявления @MockBean в базовый класс, и это сработало нормально, потому что новый контекст не создается. Но это делает базовый класс слишком тяжелым. Кроме того, я попытался создать грязный контекст для этого теста, но затем следующий тест завершился неудачно с сообщением о том, что контекст уже закрыт.