Запуск интеграционных тестов с помощью Springboot

У меня есть несколько тяжелых интеграционных тестов Spring (да, это не лучший подход, и у меня не хватает времени, чтобы правильно имитировать все внешние зависимости)

Вот типовая аннотация теста


@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@EmbeddedKafka(
        partitions = 1,
        brokerProperties = {"log.dir=target/${random.int}/embedded-kafka/data"},
        topics = {
                "${service.topic}",
                "${service.dead-letter-topic}"
        })
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OneOfMyHeavyintegrationTests extends DatabaseBackedTest {

// omitted for brevity
//
}

// foundation for DB in tests
@ContextConfiguration(initializers = DatabaseBackedTest.Initializer.class)
public abstract class DatabaseBackedTest {

    private static final EmbeddedPostgresInfo db = EmbeddedPostgresDatabase.create().start();

    static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext context) {
            TestPropertyValues.of("spring.datasource.url=" + db.getJdbcUrl()).applyTo(context.getEnvironment());
        }
    }

}

Тесты периодически терпят неудачу из-за

22:14:51.462  [main] INFO  o.a.k.common.utils.AppInfoParser - Kafka version : 2.0.1 
22:14:51.463  [main] INFO  o.a.k.common.utils.AppInfoParser - Kafka commitId : fa14705e51bd2ce5 
22:14:51.466  [main] WARN  o.a.k.common.utils.AppInfoParser - Error registering AppInfo mbean 
javax.management.InstanceAlreadyExistsException: kafka.server:type=app-info,id=0
    at java.management/com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:436)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1855)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:955)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:890)
    at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:320)
    at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at org.apache.kafka.common.utils.AppInfoParser.registerAppInfo(AppInfoParser.java:62)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:321)
    at kafka.utils.TestUtils$.createServer(TestUtils.scala:132)
    at kafka.utils.TestUtils.createServer(TestUtils.scala)

Возникает два вопроса: 1. Как правильно заставить тесты сосуществовать вместе? Я установил forkCount=0 в плагине surefire. Казалось, это помогло

  1. как правильно mock / disable компоненты перед запуском тестов?

2.1. Мне действительно не нужно запускать все мои @Scheduled @Component во время каждого теста

2.2. Мне действительно не нужно запускать потребителей Kafka на каждом тесте

Спасибо!


person Capacytron    schedule 12.10.2019    source источник


Ответы (1)


Если вы хотите запустить несколько тестов с kafka, вы можете использовать DirtiesContext для вашего тестового класса. это скажет Spring, что этот тест делает вещи, которые могут конфликтовать с другими и нуждаются в очистке. вы должны поместить его в каждый класс, который использует кафку (при этой ошибке)

Если у вас есть компоненты вашей системы, которые вам не нужны для этих тестов, используйте MockBean, чтобы заменить их на макеты при запуске сервера.

person Nir Levy    schedule 12.10.2019