如何用AssertJ断言列表元素的nick或surname包含指定值?
校验列表元素属性的最优断言实现
原始代码
@Data @AllArgsConstructor public class TolkienCharacter{ String nick; String name; String surname; } @Test void go(){ TolkienCharacter frodo = new TolkienCharacter("GoodFrodo", "Frodo", "Baggins"); TolkienCharacter togo = new TolkienCharacter("Hobbit", "Togo", "Goodbody"); List<TolkienCharacter> goodCharacters = Arrays.asList(frodo, togo); }
需求
编写断言,校验goodCharacters列表中的所有元素,其nick或surname属性包含"good"字符串(默认按不区分大小写处理,如需严格匹配可调整)。
最优实现方案
方案1:使用AssertJ(推荐)
AssertJ是专门的断言库,语法简洁直观,断言失败时会返回清晰的错误信息(比如具体哪个元素不符合条件),非常适合集合校验场景。
代码实现:
import org.assertj.core.api.Assertions; @Test void go(){ TolkienCharacter frodo = new TolkienCharacter("GoodFrodo", "Frodo", "Baggins"); TolkienCharacter togo = new TolkienCharacter("Hobbit", "Togo", "Goodbody"); List<TolkienCharacter> goodCharacters = Arrays.asList(frodo, togo); // 断言所有元素满足条件 Assertions.assertThat(goodCharacters) .allMatch(character -> character.getNick().toLowerCase().contains("good") || character.getSurname().toLowerCase().contains("good") ); }
方案2:JUnit 5原生断言 + Stream
如果不想引入额外依赖,可使用JUnit原生断言结合Stream API实现:
import static org.junit.jupiter.api.Assertions.assertTrue; @Test void go(){ TolkienCharacter frodo = new TolkienCharacter("GoodFrodo", "Frodo", "Baggins"); TolkienCharacter togo = new TolkienCharacter("Hobbit", "Togo", "Goodbody"); List<TolkienCharacter> goodCharacters = Arrays.asList(frodo, togo); // 用Stream判断所有元素是否符合条件,再用assertTrue断言 assertTrue(goodCharacters.stream().allMatch(character -> character.getNick().toLowerCase().contains("good") || character.getSurname().toLowerCase().contains("good") )); }
注意事项
- 若需要严格区分大小写匹配,只需去掉代码中的
toLowerCase()方法即可。 - AssertJ相比原生断言的优势在于:当断言失败时,会明确指出是哪个元素不满足条件,方便快速定位问题。
内容的提问来源于stack exchange,提问作者Artur
相关产品推荐
相关产品推荐

