当前位置: 首页 > 知识库问答 >
问题:

使用springboot运行集成测试

谢胤
2023-03-14

我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep)

下面是测试的典型注释


@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、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助

2.1. 在每次测试期间,我实际上不需要启动所有的@计划的@组件

2.2.我真的不需要每次测试都让Kafka消费者开始

谢谢


共有1个答案

汪皓
2023-03-14

如果您想使用kafka运行多个测试,可以在测试类上使用DirtiesContext注释。这将告诉spring,此测试可能会与其他测试发生冲突,需要进行清理。您应该将它放在每个使用kafka的类上(在这个错误上)

如果在这些测试中有不需要的系统组件,请在服务器启动时使用MockBean注释将其替换为mock

 类似资料:
  • 我试图使用Gradle的标志运行单个集成测试。我添加了另一个源代码集,并将测试放入其中。我有一个集成测试任务 这运行得很好,但是如果我尝试运行一个测试,它会告诉我它找不到匹配的测试。我不想每次编写一个新的集成测试时都必须运行每个集成测试。有办法做到这一点吗?

  • 现在我们有一个项目,包含两个工作。1) 是带有单元测试的标准构建。2) 是集成测试。它们是这样工作的: 构建整个项目,运行单元测试,启动集成测试工作 问题是步骤2)现在需要一个多小时才能运行,我想将集成测试并行化,以便它们花费更少的时间。但我不确定我该怎么做。我的第一个想法是,我可以有两个这样的步骤: 构建整个项目,运行单元测试,启动集成测试工作 构建整个项目,将其部署到integration s

  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的

  • 对于迁移管理,我决定使用Prisma Migrate,而不是节点pg Migrate(PostgreSQL)。我按照此链接中的说明操作,一切正常。然而,主要的挑战是,我的集成测试在尝试在测试数据库(而不是开发数据库)上运行迁移时失败。如何覆盖测试数据库的配置? 在节点pg migrate中,我可以在运行集成测试之前简单地提供配置:

  • 我有以下测试: 这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么? 我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。 我知道如何使用MockitoExtension和@mock、@inje