我制作了一个MethodRule和@ Rule-annotation,可以让我的测试生活变得更轻松。 它检查是否抛出了特定的异常,并检查异常消息是否等于或包含给定的消息。JUnit MethodRule只测试一行
现在,当我运行testmethod多行测试时,它只需要第一行,并准备好了。我如何制作测试方法中的所有线?
这是我的代码: 注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ExpectedDomeinValidatieMessage {
String value() default "";
String contains() default "";
}
MethodRule:
@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
}
马修,你描述失败的情况。当然,它会停止,那是预料之中的。但是当第一条测试线是好的时候,第二条线没有经过测试。 – 2012-03-15 08:28:50
编辑答案包括更好的解释发生了什么事。 – 2012-03-15 09:20:43
我想我明白了。当然它会抛出异常并通过控制。所以我已经超越了没有回报的地步,因为这不会被记录为错误。我会看看TestRule。 – 2012-03-15 10:27:07