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

如何为Spring Boot中的GCP Pub/Sub编写JUnit测试用例

GCP Pub/Sub JUnit测试用例编写指南

一、测试依赖准备

首先引入必要的测试依赖,用于Mock和集成测试:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-pubsub-test</artifactId>
    <scope>test</scope>
</dependency>

二、单元测试:发布者(Publisher)

通过Mock PubSubTemplate,验证发布逻辑是否按预期调用:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import java.util.HashMap;
import java.util.Map;

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
public class PublisherTest {

    @Mock
    private PubSubTemplate pubSubTemplate;

    @InjectMocks
    private Publisher publisher;

    @Test
    void testPublishMessage() {
        String topicName = "test-topic";
        String message = "test-payload";
        Map<String, String> attributes = new HashMap<>();
        attributes.put("key", "value");

        publisher.publish(topicName, message, attributes);

        // 验证PubSubTemplate的publish方法是否被正确调用
        verify(pubSubTemplate).publish(eq(topicName), eq(message), eq(attributes));
    }
}

三、单元测试:订阅者(Subscriber)

直接调用消息接收方法,模拟BasicAcknowledgeablePubsubMessage对象,验证消息处理和确认逻辑:

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.pubsub.v1.PubsubMessage;
import com.google.cloud.spring.pubsub.support.BasicAcknowledgeablePubsubMessage;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.HashMap;
import java.util.Map;

import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
public class SubscriberTest {

    @Mock
    private AckReplyConsumer ackReplyConsumer;

    private Subscriber subscriber = new Subscriber();

    @Test
    void testMessageReceiver() {
        String payload = "test-payload";
        Map<String, String> attributes = new HashMap<>();
        attributes.put("attr-key", "attr-value");

        // 构建模拟的PubsubMessage
        PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
                .setData(com.google.protobuf.ByteString.copyFromUtf8(payload))
                .putAllAttributes(attributes)
                .build();

        // 构建BasicAcknowledgeablePubsubMessage
        BasicAcknowledgeablePubsubMessage message =
                new BasicAcknowledgeablePubsubMessage(pubsubMessage, ackReplyConsumer);

        // 调用消息接收方法
        subscriber.messageReceiver(payload, message);

        // 验证消息是否被确认
        verify(ackReplyConsumer).ack();
    }
}

四、集成测试(可选)

使用GCP嵌入式Pub/Sub模拟器,实现端到端的发布-接收测试:

import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.gcp.pubsub.test.TestPubSubTemplate;
import org.springframework.test.context.ActiveProfiles;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@ActiveProfiles("test")
public class PubSubIntegrationTest {

    @Autowired
    private Publisher publisher;

    @Autowired
    private TestPubSubTemplate testPubSubTemplate;

    @Test
    void testPublishAndReceive() throws InterruptedException {
        String topicName = "test-topic";
        String subscriptionName = "test-sub";
        String payload = "test-integration-payload";
        Map<String, String> attributes = new HashMap<>();
        attributes.put("test-key", "test-value");

        // 创建测试用的订阅
        testPubSubTemplate.createSubscription(topicName, subscriptionName);

        // 发布消息
        publisher.publish(topicName, payload, attributes);

        // 接收消息并验证内容
        var receivedMessage = testPubSubTemplate.pullAndAck(subscriptionName, 1, 10, TimeUnit.SECONDS).get(0);
        String receivedPayload = receivedMessage.getPubsubMessage().getData().toStringUtf8();
        Map<String, String> receivedAttributes = receivedMessage.getPubsubMessage().getAttributesMap();

        assertThat(receivedPayload).isEqualTo(payload);
        assertThat(receivedAttributes).isEqualTo(attributes);
    }
}

集成测试需在application-test.properties中配置模拟器参数:

spring.cloud.gcp.pubsub.emulator-host=localhost:8085
spring.cloud.gcp.pubsub.project-id=test-project

内容的提问来源于stack exchange,提问作者Harmeet Kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:35