Запуск интеграционных тестов с использованием Springboot - PullRequest
0 голосов
/ 13 октября 2019

У меня есть несколько тяжелых интеграционных тестов 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 в верный плагин. Казалось, чтобы помочь

Каков правильный путь к mock / disable компонентам перед началом испытаний?

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

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

Спасибо!

1 Ответ

1 голос
/ 13 октября 2019

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

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

...