Проверьте, выполняется ли одно или другое в AssertJ

Я нахожусь в процессе преобразования некоторых тестов из Hamcrest в AssertJ. В Hamcrest я использую следующий фрагмент:

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

То есть список может быть и тот, и тот. Как я могу выразить это в AssertJ? Функция anyOf (конечно, любой — это нечто иное, чем любой, но это уже второй вопрос) принимает Condition; Я реализовал это сам, но мне кажется, что это должно быть обычным случаем.


person Michael Piefel    schedule 04.11.2014    source источник


Ответы (2)


Отредактировано:

Начиная с версии 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;
  };
}

Это может быть не то, что вы ожидаете, если вы ожидаете, что присутствие ваших тегов в одной коллекции подразумевает, что их нет в другой.

person Joel Costigliola    schedule 04.11.2014
comment
Это почти тот же код, который я использовал. Это немного громоздко. Condition очень похож на Hamcrest Matcher; разница в том, что Hamcrest поставляется с десятками из них (поскольку, в конце концов, это концепция Hamcrest). Кроме того, матчеры Hamcrest действительно универсальны, их можно использовать для чего угодно, и их можно брать с собой. Это цена, которую вы должны заплатить за завершение кода. Возможно, вместо условия можно было бы использовать сопоставитель Hamcrest? - person Michael Piefel; 07.11.2014
comment
Я согласен, что код громоздкий. Я думал о том, чтобы разрешить повторное использование hamcrest matcher вместо Condition, я немного неохотно, потому что это другой подход, который я не большой поклонник, поскольку мне трудно обнаружить, что является правильным матером, но в таких случаях, как ваш это хорошее решение. - person Joel Costigliola; 08.11.2014
comment
AssertJ 3.9.0 включает поддержку простого преобразования сопоставителей Hamcrest в условия AssertJ: joel-costigliola.github.io/assertj/ - person Michael Piefel; 25.05.2018

Вдохновившись этой веткой, вы можете использовать этот небольшой репозиторий, который я собрал, который адаптирует Hamcrest Matcher API в AssertJ Condition API. Также включает в себя удобный сценарий оболочки преобразования.

person Dan Haywood    schedule 18.04.2015
comment
Это выглядит многообещающе. Я попробую. - person Michael Piefel; 20.04.2015