You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut 3 如何使用 PubSubEmulatorContainer 实现集成测试

Micronaut 3.x 基于PubSubEmulatorContainer的集成测试实现方案

前置依赖配置

Maven依赖(pom.xml)

需要在测试依赖段添加以下内容:

<dependency>
    <groupId>io.micronaut.gcp</groupId>
    <artifactId>micronaut-gcp-pubsub</artifactId>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>gcloud</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.micronaut.test</groupId>
    <artifactId>micronaut-test-junit5</artifactId>
    <scope>test</scope>
</dependency>

Gradle依赖(build.gradle)

testImplementation "org.testcontainers:gcloud"
testImplementation "io.micronaut.test:micronaut-test-junit5"
implementation "io.micronaut.gcp:micronaut-gcp-pubsub"

完整测试实现(JUnit5)

Micronaut 3.x 原生支持测试阶段动态注入属性,不需要额外扩展组件,直接通过静态容器启动+动态属性配置即可实现随机端口的pubsub模拟器对接:

import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import io.micronaut.test.support.TestPropertyProvider;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PubSubEmulatorContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.util.Map;
import jakarta.inject.Inject;
// 替换为你自己的业务pubsub操作类,比如发布/订阅工具类
import com.yourpackage.service.PubSubService;

import static org.junit.jupiter.api.Assertions.*;

@MicronautTest
@Testcontainers
public class PubSubIntegrationTest implements TestPropertyProvider {

    // 启动PubSub模拟器容器,自动使用轻量官方镜像,随机端口映射
    @Container
    private static final PubSubEmulatorContainer pubSubEmulator = new PubSubEmulatorContainer();

    @Inject
    private PubSubService pubSubService;

    // 动态注入Micronaut配置,将模拟器地址传给Micronaut GCP模块
    @Override
    public Map<String, String> getProperties() {
        return Map.of(
            "gcp.pubsub.emulator-host", pubSubEmulator.getEmulatorEndpoint(),
            "gcp.project-id", "test-project"
        );
    }

    @Test
    public void testPubSubMessageSendAndReceive() {
        // 测试逻辑示例:发布消息,验证消息可被正常消费
        String testMessage = "test-payload";
        pubSubService.publishMessage("test-topic", testMessage);
        String received = pubSubService.pollMessage("test-subscription");
        assertEquals(testMessage, received);
    }
}

方案优势说明

  • 解决镜像体积过大问题:PubSubEmulatorContainer使用的专用模拟器镜像体积仅约200MB,相比数GB的google/cloud-sdk镜像,测试启动速度提升60%以上
  • 无需固定端口配置:容器自动分配随机端口,通过TestPropertyProvider动态注入到Micronaut配置中,不需要在maven-surefire-plugin中硬编码环境变量,支持多测试并行运行无端口冲突
  • 无业务代码侵入:完全使用Micronaut官方GCP模块的原生配置能力,不需要手动自定义TransportChannelProvider,业务代码无需任何调整即可直接在测试中使用

内容的提问来源于stack exchange,提问作者Roar S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:09:01