JUnit MethodRule只测试一行



我做了一个MethodRule和@Rule注释,使我的测试生活更轻松。它检查是否引发了特定的异常,并检查异常消息是否等于或包含给定的消息。

现在,当我运行一个有更多行要测试的测试方法时,它只需要第一行,然后就可以了。我如何使测试方法中的所有行都得到测试?

这是我的代码:注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ExpectedDomeinValidatieMessage {
    String value() default "";
    String contains() default "";
}

方法规则:

@Override
public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
return new Statement() {
  @Override
  public void evaluate() throws Throwable {
    ExpectedDomeinValidatieMessage message = method.getAnnotation(ExpectedDomeinValidatieMessage.class);
    if (message == null) {
      base.evaluate();
    } else {
      try {
        base.evaluate();
        Assert.fail("DomeinValidatieException not thrown");
      } catch (DomeinValidatieException e) {
        if (StringUtils.isNotBlank(message.value())) {
          if (!e.getMessage().equals(message.value())) {
            throwException(e, "", message.value(), e.getMessage());
          }
        }
        if (StringUtils.isNotBlank(message.contains())) {
          if (!e.getMessage().contains(message.contains())) {
            throwException(e, "Segment niet gevonden:", message.contains(), e.getMessage());
          }
        }
      }
    }
  }
  private void throwException(Throwable exception, String message, String expected, String actual) {
    ComparisonFailure cf = new ComparisonFailure(message, expected, actual);
    cf.setStackTrace(exception.getStackTrace());
    throw cf;
  }
};

用法:

@Test
@ExpectedDomeinValidatieMessage("[Werkzaamheden] WerkzaamMetGevaarlijkeStoffen niet gevuld")
public void valideerWerkzaamMetGevaarlijkeStoffen() throws DomeinValidatieException {
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen(null);
    validator.valideer();
}

如果我这样使用它,它只测试方法中的第一个测试:

@Test
@ExpectedDomeinValidatieMessage("[Werkzaamheden] WerkzaamMetGevaarlijkeStoffen niet gevuld")
public void valideerWerkzaamMetGevaarlijkeStoffen() throws DomeinValidatieException {
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen(null);
    validator.valideer(); //Only this one is tested
    aanvraag.getVerzekerde().getWerkzaamheden().setWerkzaamMetGevaarlijkeStoffen("bla");
    validator.valideer(); //This is NOT tested
}

通过调试器运行代码。我的猜测是,对valideer()的第一次调用确实抛出了一个异常,尽管你没有预料到JUnit assertXXX方法通过抛出异常(特别是AssertionError)来工作。因此,当抛出异常(由代码或断言抛出)时,控件将从测试方法中退出。没有任何方法可以从引发异常的地方重新启动。

您可能想要Parameterized,它允许您使用不同的参数多次运行相同的测试。

编辑:我怀疑valider()正在引发异常。为了进一步解释,让我们改写一下您的代码。当你定义一个规则时,你有效地做了以下事情:

try {
    base.evaluate(); // this calls valideerWerkzaamMetGevaarlijkeStoffen()
    Assert.fail("DomeinValidatieException not thrown");
} catch (DomeinValidatieException e) {
    // evaluate whether or not the test has failed or not
}

这意味着,如果您对valideer()的第一次调用引发异常,那么控制权将转移到上面的catch块。没有机会继续执行测试,因为控制已经通过了其他地方。您可以随心所欲地通过/不通过测试,但控制权已经传递给了上面的catch块。

顺便说一句,MethodRule在以后的版本中已经被弃用,您应该使用TestRule。

最新更新