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

如何为Java方法getFormattedDoubleValue编写正确的JUnit5测试

问题描述

我是Java初学者,接到任务需要为已编写完成的代码创建JUnit 5测试用例。当前我需要为如下方法编写测试,但不清楚该方法的测试编写思路:

public static Double getFormattedDoubleValue(Number value){         
    return getFormattedDoubleValue(value, -1); 
}

我尝试编写了如下测试用例,虽然测试可以正常通过,但我感觉自己测试的内容并不正确,没有针对目标方法进行验证:

@Test
public void testDoubleString() {
    Double num = 41.1212121212;
    String expected = "41.12";
    String actual = String.format("%.2f", num);
    assertEquals(expected, actual, "Should return 41.12");
}
现有测试的问题

你写的这个测试从头到尾没有调用过你要测的getFormattedDoubleValue方法,本质是在验证JDK自带的String.format方法的格式化逻辑,和你要测的目标方法没有任何关系,自然测不到目标方法的逻辑是否正确。

测试编写思路

你现在要测的这个单参数getFormattedDoubleValue是个重载包装方法,核心逻辑只有一个:调用双参数版本的getFormattedDoubleValue,固定传入第二个参数值为-1。所以测试不需要重复验证双参数版本已经覆盖过的格式化规则,只需要验证这个包装方法的透传逻辑是正确的,覆盖以下场景即可:

  • 常规入参场景:传入不同类型的Number值(Integer、Long、Double、Float、BigDecimal等),验证单参数方法的返回值,和直接调用getFormattedDoubleValue(对应入参, -1)的返回值完全一致
  • 边界入参场景:传入null、Double.NaN、正负无穷、0、负数这类特殊值,验证单参数方法的返回/异常抛出行为,和双参数版本传入-1时的行为完全对齐
  • 浮点数断言注意要指定允许的误差范围,不要直接做精确相等判断,避免浮点数精度问题导致测试偶发失败
参考测试代码
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class DoubleFormatUtilTest {

    @Test
    void shouldCallTwoArgOverloadWithDefaultScaleCorrectly() {
        // 覆盖常规数值类型
        Number[] normalCases = {41.1212121212, 200, 0L, -2.71828f, 3.1415926535};
        for (Number testVal : normalCases) {
            Double expect = getFormattedDoubleValue(testVal, -1);
            Double actual = getFormattedDoubleValue(testVal);
            // 浮点数比对允许1e-9的精度误差
            assertEquals(expect, actual, 1e-9, "单参方法返回值需与双参方法传-1的结果一致");
        }
    }

    @Test
    void shouldHandleSpecialInputConsistentWithTwoArgOverload() {
        // 覆盖特殊值场景
        Number[] specialCases = {null, Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY};
        for (Number testVal : specialCases) {
            Double expect = getFormattedDoubleValue(testVal, -1);
            Double actual = getFormattedDoubleValue(testVal);
            assertEquals(expect, actual, "特殊值处理逻辑需与双参方法传-1的行为一致");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:48:16