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

JUnit无状态被测类:BeforeAll与BeforeEach初始化选择?

关于JUnit中@BeforeAll与@BeforeEach的选择

你的思路完全正确,这里用@BeforeAll创建静态的Calculator实例是合理且高效的选择,理由如下:

  • 无状态类的特性适配:你的Calculator是无状态的——calculatePrice方法仅依赖输入参数完成计算,不会修改自身内部状态。这种情况下,多个测试方法共享同一个实例不会产生测试污染(即某个测试的执行不会影响其他测试的结果)。
  • 执行效率优势:@BeforeAll只会在整个测试类的所有测试方法执行前运行一次,相比@BeforeEach为每个测试方法都新建Calculator实例,能减少不必要的对象创建开销,提升测试执行效率。

注意事项

  • 如果后续Calculator被修改为有状态类(比如新增内部变量记录计算历史、缓存结果等),则必须改用@BeforeEach,为每个测试方法创建独立的实例,避免测试间的状态泄露。
  • 若开启JUnit 5并行测试,需确认静态实例的线程安全性,但对于无状态类而言,由于不存在可变内部状态,多线程调用也不会引发问题。

你的当前代码写法完全符合该场景的最佳实践:

public class CalculatorShould {

    private static Calculator calculator;

    @BeforeAll
    static void setUp() {
        calculator= new Calculator();
    }

    @Test
    void calculatePriceForTwo() {
        // act
        Double price = calculator.calculatePrice(2);
        // assert
        assertEquals(10, price);
    }

    @Test
    void calculatePriceForFour() {
        // act
        Double price = calculator.calculatePrice(4);
        // assert
        assertEquals(20, price);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:31:05