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

如何编写TestNG测试用例覆盖私有匿名内部类的formatDouble方法

编写TestNG测试用例覆盖formatDouble方法并获取代码覆盖率

前置准备

首先要解决私有成员sampleFormatter的访问问题,因为测试类无法直接访问私有变量,有两种可行方案:

  • 将sampleFormatter的访问权限改为protected或包级私有(移除private修饰符);
  • 通过Java反射机制在测试类中获取该私有实例。

另外,代码中的df(推测是DecimalFormat实例)需要确保在测试环境中已正确初始化,避免出现空指针异常。

TestNG测试用例实现(反射方案示例)

假设包含sampleFormatter的类名为TargetClass,测试代码如下:

import org.testng.Assert;
import org.testng.annotations.Test;
import java.lang.reflect.Field;

public class TargetClassTest {

    @Test
    public void testFormatDouble_NaNScenario() throws NoSuchFieldException, IllegalAccessException {
        // 初始化目标类实例
        TargetClass target = new TargetClass();
        // 反射获取私有sampleFormatter成员
        Field formatterField = TargetClass.class.getDeclaredField("sampleFormatter");
        formatterField.setAccessible(true);
        SampleFormatter formatter = (SampleFormatter) formatterField.get(target);
        
        // 测试NaN分支
        String result = formatter.formatDouble(1, Double.NaN, 2);
        Assert.assertEquals(result, "NaN");
    }

    @Test
    public void testFormatDouble_ZeroValueScenario() throws NoSuchFieldException, IllegalAccessException {
        TargetClass target = new TargetClass();
        Field formatterField = TargetClass.class.getDeclaredField("sampleFormatter");
        formatterField.setAccessible(true);
        SampleFormatter formatter = (SampleFormatter) formatterField.get(target);
        
        // 测试0.0D分支
        String result = formatter.formatDouble(2, 0.0D, 3);
        Assert.assertEquals(result, "0");
    }

    @Test
    public void testFormatDouble_NormalValueScenario() throws NoSuchFieldException, IllegalAccessException {
        TargetClass target = new TargetClass();
        Field formatterField = TargetClass.class.getDeclaredField("sampleFormatter");
        formatterField.setAccessible(true);
        SampleFormatter formatter = (SampleFormatter) formatterField.get(target);
        
        // 根据df的实际格式编写断言,示例假设df为保留两位小数的DecimalFormat
        String result = formatter.formatDouble(3, 123.456, 2);
        Assert.assertEquals(result, "123.46");
    }
}

获取代码覆盖率

常用工具为JaCoCo,结合构建工具配置即可生成覆盖率报告:

  • Maven:在pom.xml中添加JaCoCo插件配置,执行mvn test jacoco:report命令,报告生成在target/site/jacoco目录下,打开index.html即可查看formatDouble方法的分支覆盖情况;
  • Gradle:在build.gradle中配置JaCoCo插件,执行gradle test jacocoTestReport命令,报告位于build/reports/jacoco/test/html目录。

优化建议

如果不想使用反射,推荐调整sampleFormatter的访问权限,或者在TargetClass中添加一个公共方法返回该实例:

public SampleFormatter getSampleFormatter() {
    return sampleFormatter;
}

这样测试类可以直接调用该方法获取实例,无需反射,代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:43:14