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

