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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:15