Mockito:基于特定属性匹配器,按DatabaseRequest的operation返回不同响应
基于DatabaseRequest的operation字段返回不同响应的实现方案
你可以通过Mockito的参数匹配器来实现根据DatabaseRequest的operation字段返回不同响应的需求,以下是几种简洁的实现方式:
方式一:直接使用argThat结合Lambda表达式
这是最直观的写法,直接在匹配器里判断请求的operation值:
import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.when; // 匹配operation为DEMO的请求,返回对应响应 when(operationService.executeOperation( argThat(req -> "DEMO".equals(req.getOperation())) )).thenReturn("DEMO_RESPONSE"); // 匹配operation为PILOT的请求,返回对应响应 when(operationService.executeOperation( argThat(req -> "PILOT".equals(req.getOperation())) )).thenReturn("PILOT_RESPONSE");
如果需要兼容null请求的情况,可在Lambda里补充空判断:
argThat(req != null && "DEMO".equals(req.getOperation()))
方式二:使用Answer接口统一处理多场景
如果需要支持更多operation类型,用Answer可以把逻辑集中在一起,更便于维护:
import static org.mockito.Mockito.any; import static org.mockito.Mockito.when; when(operationService.executeOperation(any(DatabaseRequest.class))) .thenAnswer(invocation -> { // 获取传入的DatabaseRequest参数 DatabaseRequest request = invocation.getArgument(0); // 根据operation字段返回对应结果 return switch(request.getOperation()) { case "DEMO" -> "DEMO_RESPONSE"; case "PILOT" -> "PILOT_RESPONSE"; // 可添加更多operation分支 default -> "DEFAULT_RESPONSE"; // 处理未定义的operation }; });
注意事项
- 确保
DatabaseRequest类的getOperation()方法是可访问的(public或包级访问权限,保证测试类能调用) - 以上代码基于Mockito 2.x及以上版本,低版本可能需要自定义
ArgumentMatcher类(不推荐,不如Lambda简洁)
内容的提问来源于stack exchange,提问作者Ansar Samad
相关产品推荐
相关产品推荐

