Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnitMethodRule只测试一行_Java_Junit - Fatal编程技术网

Java JUnitMethodRule只测试一行

Java JUnitMethodRule只测试一行,java,junit,Java,Junit,我做了一个MethodRule和@Rule注释,使我的测试生活更轻松。 它检查是否引发了特定的异常,并检查异常消息是否等于或包含给定的消息 现在,当我运行一个有更多行要测试的testmethod时,它只需要第一行就可以了。如何使testmethod中的所有行都经过测试 这是我的代码: 注释: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ExpectedDomeinValid

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

现在,当我运行一个有更多行要测试的testmethod时,它只需要第一行就可以了。如何使testmethod中的所有行都经过测试

这是我的代码: 注释:

@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
}

JUnit assertXXX方法通过抛出异常(特别是AssertOnError)来工作。因此,当代码或断言控件引发异常时,测试方法将退出。无法从引发异常的位置重新启动

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

编辑:我怀疑valideer正在抛出异常。为了进一步解释,让我们解释一下您的代码。定义规则时,您有效地执行以下操作:

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。

JUnit assertXXX方法通过抛出异常(特别是AssertionError)来工作。因此,当代码或断言控件引发异常时,测试方法将退出。无法从引发异常的位置重新启动

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

编辑:我怀疑valideer正在抛出异常。为了进一步解释,让我们解释一下您的代码。定义规则时,您有效地执行以下操作:

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。

通过调试器运行代码。我的猜测是,对valideer的第一次调用确实会引发异常,即使您不希望它发生。

通过调试器运行代码。我的猜测是,对valideer的第一次调用确实会抛出异常,即使您没有预料到它。

Matthew,您描述了失败的情况。当然,这是意料之中的。但是当第一条测试线正常时,第二条测试线就没有测试。编辑答案以更好地解释发生了什么。我想我明白了。当然,它会抛出异常并传递控制。因此,我已经超出了无法返回的范围,无法将其记录为错误。我来看看TestRule。你可能应该看看parameterized。Matthew,你描述了失败的情况。当然,这是意料之中的。但是当第一条测试线正常时,第二条测试线就没有测试。编辑答案以更好地解释发生了什么。我想我明白了。当然,它会抛出异常并传递控制。因此,我已经超出了无法返回的范围,无法将其记录为错误。我来看看TestRule。你可能应该看看参数化的。Aaron,我想你是对的。它确实会抛出DomeInvalidateException,正如预期的那样。所以可能这就是为什么我们只需要第一个可测试的LoC。现在我必须找到一种方法来消除额外的错误…亚伦,我认为你是对的。它确实会抛出DomeInvalidateException,正如预期的那样。所以可能这就是为什么我们只需要第一个可测试的LoC。现在我必须找到一种方法来消除增加的错误。。。