JUnit 覆盖无法访问的代码

Posted

技术标签:

【中文标题】JUnit 覆盖无法访问的代码【英文标题】:JUnit covering unreachable code 【发布时间】:2013-07-21 09:52:44 【问题描述】:

我得到了一个 java 代码,我必须编写测试用例才能获得 100% 的覆盖率。但是,给出的代码是以这样一种方式编写的,即“if”语句之一永远不会是真的。我们无法更改代码,仍然必须实现 100% 的代码覆盖率。怎么做。该工具只是助手,在其中一篇文章中提到过,但是如果我们需要这样做怎么办。代码是-`

    public double getArea(int side1, int side2, int side3 ) 
    String type = determineTriangleType(side1+"", side2+".1", side3+"");
    double  area;

    //Different way of calculation for Equilateral
    if(type.equals("Equilateral"))
    
        area =(Math.sqrt(3)/4)*side1 *side2;
    `  else.....

我无法给出上面“如果”为真的测试用例。

determineTriangleType 方法是public String determineTriangleType(String side1, String side2, String side3 ) ......Some Processing.....

【问题讨论】:

【参考方案1】:

这里通常的方法是确保type 是所需的值。为此,您需要更改 determineTriangleType 以返回所需的类型。

这就是模拟对象的用武之地。这个想法是扩展被测 Java 类并覆盖 determineTriangleType 以在派生实现中无条件地返回正确的值。然后在派生类的实例上调用要测试的方法,现在方法的 if 语句将执行。

public class DerivedToCheckIf extends BaseClass 
  @Override
  public String determineTriangleType(String side1, String side2, String side3) 
    // call to super implementation may not be required
    // if the method does not change object state which affects the method under test
    super.determineTriangleType(side1, side2, side3);
    return "Equilateral";
  

【讨论】:

但是,原始基类中的覆盖百分比不会改变,因为该语句在基类中仍然无法访问 嗯,另一种选择是希望determineTriangleType 有一个错误,它取消被测方法中的错误。在这种情况下,您可以传入一个等边三角形并获得预期的结果。

以上是关于JUnit 覆盖无法访问的代码的主要内容,如果未能解决你的问题,请参考以下文章

grails代码覆盖无法访问方法

无法访问junit测试类中的包私有方法

SonarQube 代码覆盖率无法解释 Android 项目中的 Kotlin 文件

WordPress头像无法显示怎么办

应用中心无法访问时后台插件列表访问慢的优化

如何在 Java 应用程序中使用 JaCoCo 生成代码覆盖率报告?