AssertJ (或 JUnit )是否有办法在单个(流畅的)表达式中链接同一个被测单元上的几个断言,其中一个断言可能会抛出异常。从本质上讲,我试图断言:
如果被测单位(X)没有导致特定的异常,那就是它 然后可以断言被测单元上的特定属性不成立。否则断言异常属于某种类型。
例如,有没有办法表达以下错误代码 EITHER 导致异常或者strings.size()!= 10000的情况:
@Test/*(expected=ArrayIndexOutOfBoundsException.class)*/
public void raceConditions() throws Exception {
List<String> strings = new ArrayList<>(); //not thread-safe
Stream.iterate("+", s -> s+"+")
.parallel()
.limit(10000)
//.peek(e -> System.out.println(e+" is processed by "+ Thread.currentThread().getName()))
.forEach(e -> strings.add(e));
System.out.println("# of elems: "+strings.size());
}
AssertJ有一个soft assertions的概念,是那些在这样的场景中使用的概念吗?如果是这样,我会很感激一些代码示例。
或许有更好的框架专门为这种情景设计?
感谢。
答案 0 :(得分:1)
我不确定这是否是你真正想要的,但你可以尝试使用假设。 在执行测试代码后,对结果执行假设,只有在假设正确的情况下才会执行以下代码/断言。
由于3.9.0 AssertJ提供了开箱即用的assumptions,例如:
List<String> strings = new ArrayList<>(); // not thread-safe
int requestedSize = 10_000;
Throwable thrown = catchThrowable(() -> {
Stream.iterate("+", s -> s + "+")
.parallel()
.limit(requestedSize)
.forEach(strings::add);
});
// thrown is null if there was no exception raised
assumeThat(thrown).isNotNull();
// only executed if thrown was not null otherwise the test is skipped.
assertThat(thrown).isInstanceOf(ArrayIndexOutOfBoundsException.class);
如果要测试异步代码,还应该查看https://github.com/awaitility/awaitility。
答案 1 :(得分:0)
我想出了以下内容:
@Test
public void testRaceConditions() {
List<String> strings = new ArrayList<>(); //not thread-safe
int requestedSize = 10_000;
Throwable thrown = catchThrowable(() -> {
Stream.iterate("+", s -> s+"+")
.parallel()
.limit(requestedSize)
//.peek(e -> System.out.println(e+" is processed by "+ Thread.currentThread().getName()))
.forEach(e -> strings.add(e));
});
SoftAssertions.assertSoftly(softly -> {
softly.assertThat(strings.size()).isNotEqualTo(requestedSize);
softly.assertThat(thrown).isInstanceOf(ArrayIndexOutOfBoundsException.class);
});
}
如果有更多AssertJ的人或其他工具知道更好的方法,我很乐意接受他们的解决方案。谢谢!