JUnit:没有可运行的方法

时间:2016-08-10 14:28:21

标签: java junit

我是JUnit的新手。我正在JUnit报告中修复SonarQube,并且还会增加Junit代码覆盖率。我遇到了class,其中没有@Test annotation。抛出的异常如下:

No runnable methods java.lang.Exception: No runnable methods at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

下面的测试课程:

public class TestLimitPrice {

@BeforeClass
public static void setUpBeforeClass() {

    JndiDataManager.init();
}

private LimitPriceBean      limitPrice;
private LimitPriceValidator validator;

@Before
public void setUp() {

    limitPrice = new LimitPriceBean();
    validator = new LimitPriceValidator(limitPrice);
}}

我的问题是:

  • Sonar Report中,每个JUnit都必须至少有一个@Test通过吗?
  • @Test是否是提高代码覆盖率的好方法?
  • 如果没有执行任何测试用例,那么assertEquals(true,true)是不错的做法还是应该避免?

更新

  • 声纳版本4.4.1
  • JUnit版本4.12
  • Java 1.6-45

1 个答案:

答案 0 :(得分:3)

  

我的问题是:

     
      
  • 在声纳报告中,每个JUnit都必须至少有一个   @Test通过?
  •   

我不明白这个问题。

  
      
  • 将@Test清空是增加代码的好方法   报道?
  •   

不,有两个原因。

首先,如果@Test方法确实为空,那么就不可能增加覆盖率。因此,我们假设您有@Test方法 执行某些程序代码,但不包含断言。

在这种情况下,您通过在@Test中执行程序代码来增加测试覆盖率,但是通过不对该代码的预期结果/输出做出任何声明(断言)来完全颠覆测试的目的。假设我已经

public int addTwoAndTwo() {
  return 2+2;
}

并进行相应的测试

@Test public void testAddTwoAndTwo() {
   MyClass mc = new MyClass();   
   my.addTwoAndTwo();  // this method now "covered"
}

现在addTwoAndTwo被“覆盖”了我应该能够自信地维护它,只要单元测试继续通过,我就没有破坏任何东西。

让我们这样做。我的新版本是:

public int addTwoAndTwo() {
  return 42;
}

在那次改变之后,我的单元测试仍然成功,所以一切都必须好,对吧?嗯......不。这就是你需要断言的原因:

@Test public void testAddTwoAndTwo() {
   MyClass mc = new MyClass();   
   assertThat(mc.addTwoAndTwo()).isEqualTo(4);  // this method now truly covered
}
  
      
  • 如果没有执行任何测试用例,那么   assertEquals(true,true)是好的做法还是应该避免?
  •   

这个问题的答案现在应该是显而易见的,但要明确,不要这样做。