18

我正在将一些测试从 Hamcrest 转换为 AssertJ。在 Hamcrest 中,我使用以下代码段:

assertThat(list, either(contains(Tags.SWEETS, Tags.HIGH))
    .or(contains(Tags.SOUPS, Tags.RED)));

也就是说,列表可能是那个或那个。我如何在 AssertJ 中表达这一点?该anyOf函数(当然,any不是any ,但这将是第二个问题)需要一个Condition; 我自己已经实现了,但感觉好像这应该是一个常见的情况。

4

2 回答 2

26

编辑:

由于 3.12.0 AssertJ 提供了satisfiesAnyOf哪个成功是给定断言成功之一,

assertThat(list).satisfiesAnyOf(
    listParam -> assertThat(listParam).contains(Tags.SWEETS, Tags.HIGH),
    listParam -> assertThat(listParam).contains(Tags.SOUPS, Tags.RED)
);

原答案:

不,这是 Hamcrest 比 AssertJ 更好的领域。

编写以下断言:

Set<String> goodTags = newLinkedHashSet("Fine", "Good");
Set<String> badTags = newLinkedHashSet("Bad!", "Awful");
Set<String> tags = newLinkedHashSet("Fine", "Good", "Ok", "?");

// contains is statically imported from ContainsCondition
// anyOf succeeds if one of the conditions is met (logical 'or') 
assertThat(tags).has(anyOf(contains(goodTags), contains(badTags)));

您需要创建此条件:

import static org.assertj.core.util.Lists.newArrayList;    
import java.util.Collection;    
import org.assertj.core.api.Condition;

public class ContainsCondition extends Condition<Iterable<String>> {
  private Collection<String> collection;

  public ContainsCondition(Iterable<String> values) {
    super("contains " + values);
    this.collection = newArrayList(values);
  }

  static ContainsCondition contains(Collection<String> set) {
    return new ContainsCondition(set);
  }

  @Override
  public boolean matches(Iterable<String> actual) {
    Collection<String> values = newArrayList(actual);
    for (String string : collection) {
      if (!values.contains(string)) return false;
    }
    return true;
  };
}

如果您期望标签在一个集合中的存在意味着它们不在另一个集合中,则可能与您不同。

于 2014-11-04T21:53:51.197 回答
3

受此线程的启发,您可能想要使用我放在一起的这个仓库,它将 Hamcrest Matcher API 改编为 AssertJ 的 Condition API。还包括一个方便的转换 shell 脚本。

于 2015-04-18T11:12:52.043 回答