Я сделал аннотацию MethodRule и @ Rule, чтобы сделать мою тестовую жизнь немного проще. Он проверяет, было ли выбрано конкретное исключение, и проверяет, равно ли сообщение об исключении или содержит данное сообщение.JUnit MethodRule проверяет только одну строку
Теперь, когда я запускаю тестовый метод с большим количеством строк для проверки, он занимает только первую строку и готов. Как сделать так, чтобы все мои строки в тестовом методе были протестированы?
Это мой код: Аннотация:
@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
}
Мэтью, вы описываете ситуацию сбоя. Конечно, это останавливается, это ожидается. Но когда первая тестовая линия в порядке, вторая не тестируется. –
Отредактирован ответ, чтобы включить лучшее объяснение того, что происходит. –
Думаю, я понял. Конечно, это порождает исключение и передает контроль. Поэтому я не могу не возвращать, чтобы это не записывалось как ошибка. Я посмотрю на TestRule. –