2012-03-15 2 views
2

Я сделал аннотацию 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 
} 

ответ

0

Методы JUnit assertXXX работают путем исключения исключений (в частности, AssertionError). Поэтому, когда вызывается исключение (либо вашим кодом, либо командой assert), выход из метода тестирования. С того места, где выбрано исключение, нет никакого способа перезапустить.

Возможно, вы захотите Parameterized, что позволяет запускать одни и те же тесты несколько раз с различными параметрами.

EDIT: Я подозреваю, что 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 выше.

Кстати, MethodRule устарел в более поздних версиях, вместо этого вы должны использовать TestRule.

+0

Мэтью, вы описываете ситуацию сбоя. Конечно, это останавливается, это ожидается. Но когда первая тестовая линия в порядке, вторая не тестируется. –

+0

Отредактирован ответ, чтобы включить лучшее объяснение того, что происходит. –

+0

Думаю, я понял. Конечно, это порождает исключение и передает контроль. Поэтому я не могу не возвращать, чтобы это не записывалось как ошибка. Я посмотрю на TestRule. –

0

Запустите код через отладчик. Я предполагаю, что первый вызов valideer() действительно вызывает исключение, даже если вы этого не ожидаете.

+0

Аарон Я думаю, что ты прав. Как и ожидалось, это исключает DomeinValidatieException. Поэтому, вероятно, именно поэтому требуется только первая тестируемая LoC. Теперь я должен найти способ подавить добавленную ошибку ... –

+0

Разделить его на два теста –

Смежные вопросы