如何使用AssertJ

时间:2018-12-04 12:42:10

标签: java testing assertj

我有:

@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简化它?

2 个答案:

答案 0 :(得分:5)

该测试应满足您的需求:

@Test
public void test() {
    List<Integer> integers = Collections.singletonList(1);
    assertThat(integers)
            .has(Assertions.anyOf(
                    new Condition<>(List::isEmpty, "List is empty"),
                    new Condition<>(list -> list.size() == 1 && list.contains(1), "List contains only number 1")
            ));
}

编辑:您也可以allOf代替第二个条件:

AllOf.allOf(
      new Condition<>(list -> list.size() == 1, "List has size 1"),
      new Condition<>(list -> list.contains(1), "List contains number 1")
)

编辑2:或将其与所需列表进行比较:

new Condition<>(list -> Collections.singletonList(1).equals(list), "the list is equal to a list of the number 1")

答案 1 :(得分:2)

您要寻找的内容将在下一个版本中发布:https://github.com/joel-costigliola/assertj-core/issues/1304

assertThat("foo").satisfiesAnyOf(actual -> assertThat(actual).contains("foo"),
                                 actual -> assertThat(actual).isEmpty());

同时,最好的选择是使用Ondra K或您的建议中的anyOf