繁体   English   中英

JUnit:没有可运行的方法

[英]JUnit: No runnable methods

我是JUnit新手。 我正在SonarQube报告中修复JUnit ,并且还增加了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

我的问题是:

  • 在声纳报告中,每个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)是好的做法还是应该避免?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM