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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:21:03