AssertJ Java:多条件断言

问题描述 投票:0回答:1

是否可以用Java AssertJ编写多条件断言,如果至少满足一个条件,该断言就会通过? (类似于 OR 运算符)

我想要这样的东西:

assertThat(listOfStrings)
           .satisfiesAnyOf(
                 a -> Assertions.assertThat(listItem).matches(someRegex),
                 // OR
                 b -> Assertions.assertThat(listItem).equals(someString)
            );

断言将接收字符串列表,并将根据正则表达式检查列表中的每个元素是否等于另一个字符串,如果至少满足一个条件 - 断言应该通过。

非常感谢任何帮助!

尝试了很多选择,但没有一个能完美工作。

java selenium-webdriver testing assertj
1个回答
0
投票

我们到了。您可以根据需要将

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.+?")))
    ;
}
© www.soinside.com 2019 - 2024. All rights reserved.