Подтвердить что ты не робот

Продолжение выполнения теста в junit4, даже когда одно из утверждений не работает

У меня есть существующая фреймворк, созданный с помощью Jfunc, который обеспечивает возможность продолжения выхода даже в случае сбоя одного из утверждений в тестовом случае. Jfunc использует junit 3.x framework. Но теперь мы переходим на junit4, поэтому я больше не могу использовать Jfunc и заменил его junit 4.10 jar.
Теперь проблема заключается в том, что мы широко использовали jfunc в нашей структуре, а с junit 4 мы хотим, чтобы наш код продолжал выполнение, даже если одно из утверждений терпит неудачу в тестовом случае.
Кто-нибудь имеет какие-либо предложения/идеи для этого, я знаю, что в junit тесты должны быть более атомарными, то есть один утверждать в каждом тестовом случае, но мы не можем сделать это в нашей структуре по какой-то причине.

4b9b3361

Ответ 1

Вы можете сделать это, используя правило ErrorCollector.

Чтобы использовать его, сначала добавьте правило в качестве поля в тестовом классе:

public class MyTest {
    @Rule
    public ErrorCollector collector = new ErrorCollector();

    //...tests...
}

Затем замените свои утверждения на вызовы на collector.checkThat(...).

например.

@Test
public void myTest() {
    collector.checkThat("a", equalTo("b"));
    collector.checkThat(1, equalTo(2));
}

Ответ 2

Я также использую ErrorCollector, но также использую assertThat и помещаю их в блок catch try.

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@Rule
public ErrorCollector collector = new ErrorCollector();

@Test
public void calculatedValueShouldEqualExpected() {
    try {
        assertThat(calculatedValue(), is(expected));
    } catch (Throwable t) {
        collector.addError(t);
        // do something
    }
}

Ответ 3

Вы также можете использовать assertj - мягкое утверждение

@Test
public void testCollectErrors(){
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(true).isFalse();
   softly.assertThat(false).isTrue();
   // Don't forget to call SoftAssertions global verification !
   softly.assertAll();
}

Также существует другой способ его использования без ручного вызова softly.assertAll();

Ответ 4

Используйте блоки try/finally. Это сработало в моем случае:

...
try {
    assert(...)
} finally {
    // code to be executed after assert
}
...