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