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

JUnit 4测试返回回调的方法:验证Google PubSub消息处理逻辑

测试Google PubSub回调方法的JUnit4示例

前提依赖

测试需要用到JUnit4和Mockito,Maven依赖如下:

<dependency>
    <groupId>org.junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

被测类示例

假设你的业务类是PubSubMessageHandler,包含目标回调方法和业务方法:

import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.pubsub.v1.PubsubMessage;
import com.google.cloud.pubsub.v1.AckReplyConsumer;

public class PubSubMessageHandler {
    private MessageReceiver getMessageReceiver() {
        return (message, consumer) -> {
            if (message.getAttributesMap() != null) {
                method1();
            } else {
                method2();
            }
        };
    }

    void method1() {
        // 你的业务逻辑
    }

    void method2() {
        // 你的业务逻辑
    }
}

JUnit4测试用例

通过Mockito跟踪业务方法调用,反射获取私有回调方法,验证不同消息场景下的方法执行:

import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.pubsub.v1.PubsubMessage;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Method;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class PubSubMessageHandlerTest {

    @Spy
    private PubSubMessageHandler handler;

    @Mock
    private AckReplyConsumer consumer;

    @Test
    public void messageWithAttributes_callsMethod1() throws Exception {
        // 反射获取私有回调方法
        Method receiverMethod = PubSubMessageHandler.class.getDeclaredMethod("getMessageReceiver");
        receiverMethod.setAccessible(true);
        MessageReceiver receiver = (MessageReceiver) receiverMethod.invoke(handler);

        // 构造带属性的消息
        PubsubMessage message = PubsubMessage.newBuilder()
                .putAttributes("test-key", "test-value")
                .build();

        // 执行回调逻辑
        receiver.receiveMessage(message, consumer);

        // 验证method1被调用,method2未被调用
        verify(handler, times(1)).method1();
        verify(handler, never()).method2();
    }

    @Test
    public void messageWithoutAttributes_callsMethod2() throws Exception {
        // 反射获取私有回调方法
        Method receiverMethod = PubSubMessageHandler.class.getDeclaredMethod("getMessageReceiver");
        receiverMethod.setAccessible(true);
        MessageReceiver receiver = (MessageReceiver) receiverMethod.invoke(handler);

        // 模拟属性Map为null的消息
        PubsubMessage message = mock(PubsubMessage.class);
        when(message.getAttributesMap()).thenReturn(null);

        // 执行回调逻辑
        receiver.receiveMessage(message, consumer);

        // 验证method2被调用,method1未被调用
        verify(handler, times(1)).method2();
        verify(handler, never()).method1();
    }
}

关键说明

  • @Spy用于包装被测类,实现对method1和method2的调用跟踪
  • 反射调用私有方法getMessageReceiver,获取回调实例
  • @Mock模拟AckReplyConsumer,避免依赖真实消费逻辑
  • 分两种场景验证:带属性的消息触发method1,属性Map为null的消息触发method2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:15:39