我製作了一個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