【问题标题】:Code Coverage for block which has throws具有 throws 的块的代码覆盖率
【发布时间】:2012-03-12 14:46:47
【问题描述】:

我有个sn-p如下

public void setTarget(String target) throws TargetException{
   if(target = null){
      throw new TargetException();
   }
   this.target = target;
}

public void getTarget(){
   return this.target;
}

我正在对上面的sn-p进行单元测试

@Test(expected = TargetException.class)
public void testTargetSetting() throws TargetException{
   //For coverage of code in if loop
   String target = null;
   MyBean.setTarget(target);
   //For coverage of code in else loop
   target="abc";
   MyBean.setTarget(target);
}

现在上面代码的问题是要测试的类的代码覆盖率显示为 100%,即方法 setTarget。它同时出现在 if 和 else 块中。但是没有覆盖测试类方法即testTargetSetting 的覆盖范围。它始终显示为红色。

我正在使用 Emma 进行代码覆盖。知道如何满足实际类方法和测试类方法的代码覆盖率。

注意:上面给出的代码仅用于说明。

【问题讨论】:

    标签: java junit emma


    【解决方案1】:

    要覆盖测试类,您必须为您的测试类编写一个测试类。要覆盖该类,您必须为您的测试类编写一个测试类。

    简单地说,像 Emma 这样的工具并不是为了显示测试类的覆盖率。他们使用您的测试课程来显示您的常规课程的覆盖率。

    【讨论】:

    • 问题是,如果我删除用于异常的块,则测试类方法覆盖率显示为 100%。如果它不是用于测试类的,为什么它会显示测试类的覆盖率?
    【解决方案2】:

    好吧,你的测试方法没有被完全测试,因为你在另一个测试之前运行了抛出异常的测试。您的测试框架预计会出现异常,因此测试不会失败。但是,线条

    target="abc";
    MyBean.setTarget(target);
    

    不执行。

    另外三个想法:

    • 一种测试方法中有两个测试用例 - 您应该有一个测试异常的测试方法和一个测试快乐路径的测试方法
    • 如 spookyjon 的回答中所述,代码覆盖率工具通常不用于检查测试方法的覆盖率。
    • 如果异常之后的代码运行,您将实现覆盖。但是由于没有断言,除了没有发生意外异常的事实之外,您实际上不会测试任何东西。没有断言的测试没有特别的意义。

    【讨论】:

    • 非常感谢。这是有道理的
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2016-10-23
    • 2018-09-30
    • 2012-06-30
    相关资源
    最近更新 更多