Java类型不兼容错误修复后,咨询修改后代码是否整洁
修改后的代码整洁度分析
你的修改确实解决了类型不兼容的编译错误,但代码并不够整洁规范,存在以下几个明显问题:
现存问题
- 重复代码冗余:每次创建Map、调用
loadCostTypes的逻辑完全重复,仅参数值不同,没有复用逻辑,后续维护成本高。 - 命名不具备语义性:
mockResultSet1、mockResultSet2这类命名无法直接对应到具体的成本类型,可读性差,建议改为conCostMap、edeCostMap这类有明确含义的名字。 - 注释无意义:
// Setup behavior for subsequent calls这类注释完全是冗余的,代码本身已经表达了执行逻辑,无需额外说明。 - 测试无有效验证:最后仅用
Assertions.assertTrue(true);作为断言,没有验证Product的成本属性是否被正确更新、margin是否计算正确,这个测试实际上没有覆盖任何业务逻辑,无法保证代码功能正确性。
优化后的代码示例
可以通过参数化测试(JUnit 5)或者循环遍历测试数据的方式消除重复,同时补充有效断言:
方案1:使用JUnit 5参数化测试
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; @ParameterizedTest @CsvSource({ "CON, 10, 10.0", "EDE, 15, 15.0", "EDH, 15, 15.0", "PAD, 15, 15.0", "EDK, 15, 15.0", "GSA, 15, 15.0", "GOV, 15, 15.0" }) void testLoadCostTypes(String costTypeCode, String costValue, Double expectedCost) throws SQLException { // 初始化测试数据 Map<String, String> costMap = resultSetToMap(costTypeCode, costValue); Product product = new Product(); // 初始设置所有成本为12d,确保被覆盖 product.setConCost(12d); product.setEdeCost(12d); product.setEdhCost(12d); product.setEdkCost(12d); product.setGovCost(12d); product.setPasCost(12d); product.setGsaCost(12d); // 执行测试方法 wfRequestRepository.loadCostTypes(costMap, product); // 根据成本类型验证对应属性是否更新 switch (costTypeCode) { case "CON": assertEquals(expectedCost, product.getConCost()); break; case "EDE": assertEquals(expectedCost, product.getEdeCost()); break; case "EDH": assertEquals(expectedCost, product.getEdhCost()); break; case "PAD": assertEquals(expectedCost, product.getPasCost()); break; case "EDK": assertEquals(expectedCost, product.getEdkCost()); break; case "GSA": assertEquals(expectedCost, product.getGsaCost()); break; case "GOV": assertEquals(expectedCost, product.getGovCost()); break; } // 若需要验证margin,可补充对应断言(需确保product的fixedPrice已设置) }
方案2:使用循环遍历测试数据列表
@Test void testLoadCostTypes() throws SQLException { // 定义测试数据列表:成本类型、成本值、对应的属性验证逻辑 List<TestData> testDataList = Arrays.asList( new TestData("CON", "10", p -> p.getConCost()), new TestData("EDE", "15", p -> p.getEdeCost()), new TestData("EDH", "15", p -> p.getEdhCost()), new TestData("PAD", "15", p -> p.getPasCost()), new TestData("EDK", "15", p -> p.getEdkCost()), new TestData("GSA", "15", p -> p.getGsaCost()), new TestData("GOV", "15", p -> p.getGovCost()) ); Product product = new Product(); // 初始化所有成本属性 product.setConCost(12d); product.setEdeCost(12d); product.setEdhCost(12d); product.setEdkCost(12d); product.setGovCost(12d); product.setPasCost(12d); product.setGsaCost(12d); for (TestData data : testDataList) { Map<String, String> costMap = resultSetToMap(data.costTypeCode, data.costValue); wfRequestRepository.loadCostTypes(costMap, product); // 验证属性是否正确更新 assertEquals(Double.valueOf(data.costValue), data.costGetter.apply(product)); } } // 内部类封装测试数据 private static class TestData { String costTypeCode; String costValue; Function<Product, Double> costGetter; TestData(String costTypeCode, String costValue, Function<Product, Double> costGetter) { this.costTypeCode = costTypeCode; this.costValue = costValue; this.costGetter = costGetter; } }
额外建议
- 可以给
loadCostTypes方法的参数rs重命名为costDataMap,避免和ResultSet混淆,提升可读性。 - 原
loadCostTypes方法中的多分支if-else可以优化为枚举+策略模式,减少代码冗余,提升可维护性。
内容的提问来源于stack exchange,提问作者QueenOfCode
相关产品推荐
相关产品推荐

