我已经浏览了 AssertJ 示例(https://github.com/joel-costigliola/assertj-examples/blob/master/assertions-examples/src/test/java/org/assertj/examples/IterableAssertionsExamples.java)但是我找不到以下示例:-
3null例如
List<String> items= Arrays.asList(null, null, null);
assertThat(items).hasSize(3).containsOnlyNulls();
注意 -
containsOnlyNulls不存在,但这基本上是我想要测试的。这可以在 AssertJ 中实现吗?
在 AssertJ 中,您可以执行以下操作来断言列表的内容:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
我经常发现自己想要对元素本身做更复杂的断言,例如,断言 Alice 是一个高个子黑发,而 Bob 又小又秃。使用 AssertJ 执行此操作的最佳方法是什么?
我自己的解决方案是:
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
list.stream()
    .filter(person -> "Alice".equals(person.getName()))
    .forEach(alice -> {
        assertThat(alice).extracting("size").isEqualTo("tall")
        assertThat(alice).extracting("hair").isEqualTo("brunette")
    });
list.stream()
    .filter(person -> "Bob".equals(person.getName()))
    .forEach(bob -> {
        assertThat(bob).extracting("size").isEqualTo("tiny")
        assertThat(bob).extracting("hair").isNull()
    });
或等效地(java 7):
assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob");
for(Person person : list){
    switch (testCase.getName()){
        case "Alice":
            assertThat(person).extracting("size").isEqualTo("tall")
            assertThat(person).extracting("hair").isEqualTo("brunette")
            break;
        case "Bob":
            assertThat(person).extracting("size").isEqualTo("tiny")
            assertThat(person).extracting("hair").isNull()
            break;
    }
}
但我想知道是否有更好的解决方案。
我喜欢这个解决方案区分列表中的预期元素和元素本身是正确的这一事实。
我正在使用AssertJ进行测试,并且注意到有一种检查a List<T>是否排序的方法:
public static <T> void sorted(final List<T> actual) {
    try {
        assertThat(actual).isSorted();
    } catch (AssertionError e) {
        LOGGER.error(e.getMessage(), e);
        throw e;
    }
}
有没有办法检查列表是否按降序排列?
我知道番石榴提供了,Ordering.natural().reverse().isOrdered(values)但是我想利用AssertJ的assert消息,因为它确实对调试很有帮助,例如
group is not sorted because element 5:
 <"4000366190001391">
is not less or equal than element 6:
 <"4000206280001394">
group was:
 <["4000206280001363",
    "4000206280001364",
    "4000206280001365",
    "4000206280001373",
    "4000206280001388",
    "4000366190001391",
    "4000206280001394",
    "4000366190001401",
    "4000206280001403",
    "4000206280001405",
     ....]>
我有:
@Test
public void testSomethingInFooFunction() {
    //given
    Something parameter = new Something();
    //when
    List<Object> result = foo(parameter);
    //then
    // not working
    assertThat(result).isEmpty().or().containsOnly(something());
    assertThat(result).is(v -> v.isEmpty() || v.containsOnly(something());
    //is working
    assertThat(result.isEmpty() || (
        result.contains(something())
        && result.size() == 1)
    ).isTrue();
}
还有其他测试条件的方法,例如:
result.isEmpty()|| (result.contains(something())&& result.size()== 1)
问:如何使用AssertJ 3.11.1简化它?
例子:
public class Office {
  List<Employee> employee;
}
我如何断言在我List<Office> offices没有员工的情况下没有?是否可以用一个断言链来断言这一点?
它看起来很酷
assertThat(yoda).is(jedi);
直到你不知道是什么yoda和jedi.但是假设
yoda instanceof Person
哪里
interface Person {
    boolean isJedi();
}
那么如何实际检查isJedi用AssertJ?
在传统JUnit我会写
assertTrue( yoda.isJedi() );
但是在AssertJ什么?