具有抛出的块的代码覆盖率

时间:2012-03-12 14:46:47

标签: java junit emma

我有一个片段如下

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

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

我正在测试上面的代码段

@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进行代码覆盖。任何想法如何满足实际类方法和测试类方法的代码覆盖率。

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

2 个答案:

答案 0 :(得分:2)

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

简单地说,像Emma这样的工具并不意味着要在测试类上显示覆盖范围。他们使用您的测试类来显示常规课程的覆盖范围。

答案 1 :(得分:1)

好吧,您的测试方法未经过完全测试,因为您运行的测试会在另一个测试之前抛出异常。您的测试框架需要异常,因此测试不会失败。但是,行

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

未执行。

另外三个想法:

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