【问题标题】:JUnit covering unreachable codeJUnit 覆盖无法访问的代码
【发布时间】: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.....}

【问题讨论】:

    标签: code-coverage junit4 unreachable-statement


    【解决方案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 有一个错误,它取消被测方法中的错误。在这种情况下,您可以传入一个等边三角形并获得预期的结果。
    猜你喜欢
    • 2019-02-24
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多