是否可以用Java AssertJ编写多条件断言,如果至少满足一个条件,该断言就会通过? (类似于 OR 运算符)
我想要这样的东西:
assertThat(listOfStrings)
.satisfiesAnyOf(
a -> Assertions.assertThat(listItem).matches(someRegex),
// OR
b -> Assertions.assertThat(listItem).equals(someString)
);
断言将接收字符串列表,并将根据正则表达式检查列表中的每个元素是否等于另一个字符串,如果至少满足一个条件 - 断言应该通过。
非常感谢任何帮助!
尝试了很多选择,但没有一个能完美工作。
我们到了。您可以根据需要将
contains
和 matchesRegex
方法放入变量中!
package org.example.test;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import static org.assertj.core.api.Assertions.assertThat;
public class MultipleConditionsTest {
@Test
public void test() {
// Given
String someString = "", regex = "";
// When
ArrayList<String> actual = new ArrayList<>();
// Then
assertThat(actual)
.anyMatch(contains(someString).or(matchesRegex(regex)));
}
private static Predicate<? super String> matchesRegex(String regex) {
return string ->Pattern.compile(regex).matcher(string).matches();
}
private static Predicate<String> contains(String someString) {
return string -> string.equalsIgnoreCase(someString);
}
}
你可以随意组合,就像这样
@Test
public void test() {
// Given
// When
List<String> fruits = Arrays.asList("banana", "apple", "orange");
// Then
assertThat(fruits)
.anyMatch(contains("raspberry").or(matchesRegex("a.+?")))
.anyMatch(contains("banana").or(matchesRegex("p.+?")))
.noneMatch(contains("blueberry").or(matchesRegex(".+?c.+?")))
;
}