Java单元测试因数值小数点与逗号格式不匹配断言失败如何解决?
问题原因
- 类型不匹配:你调用
Assertions.assertEquals时传入的第一个参数是double类型的17.41,第二个参数是String.format返回的字符串,类型不同本身就会触发断言失败。 - 本地化配置问题:
String.format默认使用JVM当前环境的默认Locale,俄语区等欧洲地区的Locale默认用逗号作为小数分隔符,所以格式化结果为17,41,和预期的点分隔格式不符。
修复方案
方案1:直接比较浮点数值(推荐)
浮点数比较直接使用JUnit自带的带误差范围的重载方法即可,不需要处理字符串格式化逻辑,稳定性更高:
@Test @DisplayName("Проверка проверка правильности рассчета") void calculationCheck () throws Exception { TriangleSquareCalculator result2 = new TriangleSquareCalculator(); // 第三个参数为允许的浮点误差,保留两位小数的场景下设置0.01即可满足需求 Assertions.assertEquals(17.41, result2.getTriangleSquare(7,5,9), 0.01); }
方案2:指定Locale格式化后比较字符串
如果你需要校验格式化后的输出格式,显式指定使用点作为小数分隔符的Locale即可:
import java.util.Locale; @Test @DisplayName("Проверка проверка правильности рассчета") void calculationCheck () throws Exception { TriangleSquareCalculator result2 = new TriangleSquareCalculator(); // 显式指定Locale为US,保证小数分隔符为点 String formattedResult = String.format(Locale.US, "%.2f", result2.getTriangleSquare(7,5,9)); // 注意预期值要使用字符串类型,不要用double类型的17.41 Assertions.assertEquals("17.41", formattedResult); }
代码优化提示
原有边长校验逻辑存在漏洞:if ((a | b | c) <= 0)无法正确拦截单边长为0的情况,建议修改为逻辑更清晰的if (a <= 0 || b <= 0 || c <= 0),避免校验遗漏。
内容的提问来源于stack exchange,提问作者AlexRu
相关产品推荐
相关产品推荐

