Java 已抛出的块的代码覆盖率

Java 已抛出的块的代码覆盖率,java,junit,emma,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 = Target

我有一个片段如下

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块。但是测试类方法ie testTargetSetting的覆盖范围不包括在内。它总是以红色显示

我使用Emma进行代码覆盖。任何关于如何满足实际类方法和测试类方法的代码覆盖率的想法


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

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


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

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


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

好吧,您的测试方法没有被完全测试,因为您运行的测试在其他测试之前抛出异常。您的测试框架需要异常,因此测试不会失败。然而,这些线

target="abc";
MyBean.setTarget(target);
没有被执行

还有三个想法:

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

好吧,您的测试方法没有被完全测试,因为您运行的测试在其他测试之前抛出异常。您的测试框架需要异常,因此测试不会失败。然而,这些线

target="abc";
MyBean.setTarget(target);
没有被执行

还有三个想法:

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

问题是,如果我删除用于异常的块,测试类方法覆盖率将显示为100%。如果它不是针对测试类的,那么为什么它会显示测试类的覆盖率呢?问题是,如果我删除用于异常的块,那么测试类方法的覆盖率将显示为100%。如果它不是针对测试类的,为什么它显示了测试类的覆盖率呢?非常感谢。这让我非常感谢你。这是有道理的