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

Quarkus测试中如何重置有状态Bean的状态?

解决Quarkus测试中有状态Bean的状态重置问题

针对你遇到的@QuarkusTest测试中,@ApplicationScoped有状态Bean跨测试保留状态导致测试失败的问题,提供以下几种可行方案:

方案一:为Bean添加重置方法,测试前置调用

这是最直接的处理方式,给业务Bean新增状态重置的公开方法,然后在每个测试用例执行前调用该方法,确保每次测试都基于干净的状态启动。

修改ExampleService,添加状态重置方法:

@ApplicationScoped
public class ExampleService {

    private final Map<String, Long> state = new HashMap<>();

    public Map<String, Long> getState() {
        return state;
    }

    public void put(String key, Long value) {
        state.put(key, value);
    }

    // 新增状态重置方法
    public void clearState() {
        state.clear();
    }
}

修改测试类,通过@BeforeEach在每个测试前重置状态:

@QuarkusTest
class ExampleServiceTest {

    @Inject
    ExampleService service;

    @BeforeEach
    void setUp() {
        service.clearState();
    }

    @Test
    void test() {
        service.put("", 1L);
        var state = service.getState();
        Assertions.assertEquals(1, state.size());
    }

    @Test
    void test2() {
        var state = service.getState();
        Assertions.assertEquals(0, state.size());
    }
}

方案二:修改Bean作用域为@Dependent(业务场景允许时)

如果你的业务逻辑允许ExampleService不是单例,可以将其作用域从@ApplicationScoped改为@Dependent。@Dependent作用域的Bean每次被注入时都会创建新实例,天然实现测试间的状态隔离。

修改ExampleService的作用域:

@Dependent
public class ExampleService {
    // 其余代码保持不变
}

方案三:使用Quarkus测试配置文件替换Bean

如果不想修改原Bean的代码或作用域,可以通过Quarkus的TestProfile机制,在测试环境中替换为一个支持状态重置的Bean实现。

  1. 创建测试配置类:
public class CleanStateTestProfile implements TestProfile {
    @Override
    public List<Class<?>> getEnabledAlternatives() {
        return List.of(CleanExampleService.class);
    }
}
  1. 创建替代Bean:
@Alternative
@ApplicationScoped
public class CleanExampleService extends ExampleService {

    @Override
    public void clearState() {
        getState().clear();
    }
}
  1. 在测试类中指定使用该配置文件:
@QuarkusTest
@TestProfile(CleanStateTestProfile.class)
class ExampleServiceTest {

    @Inject
    ExampleService service;

    @BeforeEach
    void setUp() {
        service.clearState();
    }

    // 测试用例保持不变
}

注:你提到的类似问题原标题翻译为:“如何在QuarkusTest期间保持有状态Bean干净或重置”

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:00