我有我的现有框架,建立使用Jfunc它提供了一个工具,甚至继续exection时的一个断言的测试用例失败。 Jfunc使用的JUnit 3.X框架。 但是,现在我们正在向junit4,所以我不能再使用Jfunc并使用JUnit 4.10罐子代替它。
现在的问题是,因为我们已经广泛在我们的框架中使用jfunc,并使用JUnit 4,我们想使我们的代码,甚至继续执行时的一个断言在测试案例失败。
有没有人有这方面的任何建议/想法,我知道在JUnit测试需要为每测试用例多个原子即一个断言,但我们不能这样做,在我们出于某种原因框架。
Answer 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));
}
Answer 2:
我用的是ErrorCollector太多,但也可以使用assertThat并将其放置在一个try catch块。
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
}
}
Answer 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();
- 与规则
- 与autoclosable
- 使用静态assertSoftly方法
Answer 4:
使用try / finally块。 这个工作在我的情况:
...
try {
assert(...)
} finally {
// code to be executed after assert
}
...
Answer 5:
尝试 - 捕捉,在“尝试”使用断言,在“捕捉”添加可能的错误来收集。 然后扔在测试结束时的例外,在拆解()。 因此,如果有会在断言失败/错误,它就会被获取,并测试将继续进行。 (例如,在收集是静态的,您还可以在设置(新实例),每个@Test)
public static List<String> errors = new ArrayList<>();
try {
//some assert...
}
catch (AssertionError error) {
errors.add(error.toString());
}
@After
public void tearDown() {
try {
if (!errors.isEmpty()) {
throw new AssertionError(errors);
}
}
finally {
//empty list because it's static, alternatively make instance for each test in setUp()
errors.clear();
}
}
Answer 6:
另一种选择是在与lambda表达式一起可观察到的图案。 您可以使用类似上面。
public class MyTestClass {
private final List<Consumer<MyTestClass>> AFTER_EVENT = new ArrayList<>();
@After
public void tearDown() {
AFTER_EVENT.stream().forEach(c -> c.accept(this));
}
@Test
public void testCase() {
//=> Arrange
AFTER_EVENT.add((o) -> {
// do something after an assertion fail.
}));
//=> Act
//=> Assert
Assert.assertTrue(false);
}
}
文章来源: Continuing test execution in junit4 even when one of the asserts fails