【问题标题】:Non-void test methods in JUnit 4JUnit 4 中的非空测试方法
【发布时间】:2010-10-12 17:54:01
【问题描述】:

我希望 JUnit 4 测试类实现与其测试类相同的接口。这样,当接口发生变化时(它会发生变化,我们处于早期开发阶段),编译器保证将相应的方法添加到测试类中。例如:

public interface Service {
  public String getFoo();
  public String getBar();
}

public class ServiceImpl implements Service {
  @Override public String getFoo() { return "FOO"; }
  @Override public String getBar() { return "BAR"; }
}

public class ServiceTest implements Service {
  @Override
  @Test
  public String getFoo() {
    //test stuff
  }

  @Override
  @Test
  public String getBar() {
    //test stuff
  }
}

当我尝试这个时,我得到一个错误:“java.lang.Exception: Method getFoo() should be void”, 大概是因为测试方法必须返回 void。有谁知道解决这个问题的方法吗?

【问题讨论】:

  • 我已经使用 JUnit 4 好几年了,如果不从要测试的类中以某种方式派生 JUnit 测试类,我不知道如何做你想做的事。
  • 如何强制该方法通过接口保证以任何方式被测试?由于您正在尝试使用编译器来保证测试覆盖率,可以这么说......但是与实现相同接口的生产类的单独实例并不能保证测试。它保证遵守界面。
  • 嗯,没错,它保证每个服务方法的测试类中都添加了一个方法。它不能保证该方法实际测试任何东西。坦率地说,任何代码覆盖工具都没有,因为您可以运行所有代码并断言。我只是想提醒开发人员有一些出色的测试需要考虑。
  • 查看 PMD pmd.sourceforge.net/rules/junit.html 特别是 JUnitTestsShouldIncludeAssert 规则。

标签: java unit-testing junit annotations junit4


【解决方案1】:

我不得不承认,这是一个巧妙的技巧,尽管它不能很好地扩展到多个测试场景。

无论如何,您都可以使用自定义跑步者。例如:

@RunWith(CustomRunner.class)
public class AppTest {

  @Test
  public int testApp() {
    return 0;
  }
}

public class CustomRunner extends JUnit4ClassRunner {

  public CustomRunner(Class<?> klass) throws InitializationError {
    super(klass);
  }

  protected void validate() throws InitializationError {
    // ignore
  }
}

【讨论】:

  • 不错!这正是我正在寻找的。还没有检查,因为我还没有完全让它工作。至少还没有......它抱怨“自定义运行器类CustomRunner应该有一个带有签名CustomRunner(Class testClass)的公共构造函数”。但它确实......所以我正在四处寻找以尝试让它工作。敬请期待……
  • 您是否将 CustomRunner 类放入单独的文件中?在发布到这里之前,我在我的 IDE 中运行了这个示例。
  • 成功了,谢谢。现在,由于反射,采用参数的方法存在问题,但这是一个不同的问题。非常感谢!
  • 不客气。对于带参数的方法,探索参数化测试运行器会很有趣。但我同意,这是一个不同的问题。
  • 太棒了!但是“扩展 BlockJUnit4ClassRunner”会更好,因为 JUnit4ClassRunner 已被@Deprecated。
【解决方案2】:

更自然的方法可能是使用代码覆盖工具,例如Cobertura。它与 JUnit 很好地集成,它向您展示了您的测试在某些情况下可能存在缺陷的情况(尽管有很多情况下这样的工具无法捕获)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2014-01-07
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多