如何为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
相关产品推荐
相关产品推荐

