如何为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
相关产品推荐
相关产品推荐

