Quarkus测试:缓存Mock服务(Cafine)的场景配置问题
解决Mock服务间数据一致性问题:缓存Mock结果复用失败的处理方案
问题背景
构建报表引擎时涉及三个Mock服务调用:
- 服务1:随机生成学徒申请者列表(含ID等数据)
- 服务2:生成与有效数据格式一致的申请者必填应答内容
- 服务3:先调用前两个服务,再遍历服务1的结果随机生成申请者应答
测试报表时遇到核心问题:服务1每次调用都会生成新的随机ID,导致服务3生成的应答ID与服务1的申请者ID不匹配。尝试给Mock服务类添加@CacheResult缓存注解,但未生效,服务3调用服务1时依然获取新的随机数据。
尝试过的无效方案
直接在Mock类上添加缓存注解,无报错但未实现数据复用:
@Mock @ApplicationScoped @CacheResult(cacheName = "mock-streams") public class MockStreamsResource extends StreamsResource { // 随机生成申请者列表的逻辑 }
可行解决方案
方案1:内部静态缓存实现单例数据复用
在Mock服务类内部维护静态缓存变量,首次调用时生成数据并缓存,后续调用直接返回缓存值:
@Mock @ApplicationScoped public class MockStreamsResource extends StreamsResource { private List<Applicant> cachedApplicants; @Override public List<Applicant> getApplicants() { if (cachedApplicants == null) { // 原有随机生成逻辑 cachedApplicants = generateRandomApplicants(); } return cachedApplicants; } // 可选:添加重置方法,用于不同测试用例的数据隔离 public void resetCache() { cachedApplicants = null; } }
方案2:测试上下文手动注入固定数据
在测试类中提前生成固定Mock数据,通过注入Mock服务实例手动设置缓存数据:
@QuarkusTest public class ReportEngineTest { @Inject MockStreamsResource mockStreamsResource; @Inject ThirdService thirdService; private List<Applicant> fixedApplicants; @BeforeEach void setUp() { // 生成固定的申请者数据 fixedApplicants = generateFixedApplicants(); // 通过setter方法注入(需给Mock服务添加对应setter) mockStreamsResource.setApplicants(fixedApplicants); } @Test void testReportGeneration() { Report report = thirdService.generateReport(); // 断言应答ID与申请者ID完全匹配 assertThat(report.getResponses()) .extracting(Response::getApplicantId) .containsExactlyElementsOf(fixedApplicants.stream().map(Applicant::getId).toList()); } }
方案3:修正缓存注解的使用位置
@CacheResult注解需作用在方法而非类上,同时确保引入Quarkus缓存扩展:
@Mock @ApplicationScoped public class MockStreamsResource extends StreamsResource { @Override @CacheResult(cacheName = "mock-streams") public List<Applicant> getApplicants() { // 随机生成逻辑 return generateRandomApplicants(); } }
注意:需在项目依赖中添加
quarkus-cache扩展,否则缓存注解不会生效。
内容的提问来源于stack exchange,提问作者alliancecoder
相关产品推荐
相关产品推荐

