运行 与 spring boot 的集成测试
Running integration tests with 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.让测试共存的正确方法是什么?我在 surefire 插件中设置了 forkCount=0
。好像有帮助
- 在开始测试之前
mock
/ disable
组件的正确方法是什么?
2.1。我真的不需要在每次测试时都开始 @Scheduled
@Component
2.2。我真的不需要在每次测试时都启动 Kafka 消费者
谢谢!
如果您想 运行 使用 kafka 进行多项测试,您可以在测试 class 上使用 DirtiesContext 注释。这将告诉 spring 这个测试做的事情可能会与其他人发生冲突,需要清理。你应该把它放在每个使用 kafka 的 class 上(在这个错误上)
如果您的系统中有这些测试不需要的组件,请使用 MockBean 注释在服务器启动时用模拟替换它们
我有几个繁重的 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.让测试共存的正确方法是什么?我在 surefire 插件中设置了 forkCount=0
。好像有帮助
- 在开始测试之前
mock
/disable
组件的正确方法是什么?
2.1。我真的不需要在每次测试时都开始 @Scheduled
@Component
2.2。我真的不需要在每次测试时都启动 Kafka 消费者
谢谢!
如果您想 运行 使用 kafka 进行多项测试,您可以在测试 class 上使用 DirtiesContext 注释。这将告诉 spring 这个测试做的事情可能会与其他人发生冲突,需要清理。你应该把它放在每个使用 kafka 的 class 上(在这个错误上)
如果您的系统中有这些测试不需要的组件,请使用 MockBean 注释在服务器启动时用模拟替换它们