如何用Java Truth实现多条件逻辑或(OR)断言?
Java Truth是否支持多条件“或”断言?
我希望使用Java Truth断言库判断以下任一条件是否成立:
assertThat(strToCheck).startsWith("a"); assertThat(strToCheck).contains("123"); assertThat(strToCheck).endsWith("@");
即判断strToCheck是否以"a"开头、包含子串"123"或以"@"结尾(满足任一条件即可)。已知Hamcrest可通过如下代码实现类似逻辑:
assertThat(strToCheck, anyOf(startsWith("a"), new StringContains("123"), endsWith("@")));
请问Java Truth是否支持这种逻辑或断言?
Java Truth本身没有提供像Hamcrest anyOf那样直接的多条件“或”断言API,但可以通过两种实用方式实现相同逻辑:
方式一:布尔表达式结合Truth断言
先用普通Java逻辑判断是否满足任一条件,再用Truth断言结果,这种方式简单直接,适合单次使用场景:boolean meetsCondition = strToCheck.startsWith("a") || strToCheck.contains("123") || strToCheck.endsWith("@"); assertWithMessage("字符串未满足任一预期条件:以\"a\"开头、包含\"123\"或以\"@\"结尾") .that(meetsCondition) .isTrue();方式二:自定义Subject复用逻辑
如果需要在多个测试中重复使用这类“或”断言逻辑,可以自定义扩展的String Subject,把判断逻辑封装起来:public class CustomStringSubject extends StringSubject { private final String actual; public static CustomStringSubject assertThat(String actual) { return new CustomStringSubject(actual); } private CustomStringSubject(String actual) { super(Fact.simpleFact("自定义字符串断言"), actual); this.actual = actual; } public void meetsAnyOfStartContainsEnd(String prefix, String substring, String suffix) { boolean matches = actual.startsWith(prefix) || actual.contains(substring) || actual.endsWith(suffix); if (!matches) { failWithActualExpected(actual, String.format("满足以下任一条件:以\"%s\"开头、包含\"%s\"或以\"%s\"结尾", prefix, substring, suffix)); } } }使用时只需调用自定义的断言方法:
CustomStringSubject.assertThat(strToCheck) .meetsAnyOfStartContainsEnd("a", "123", "@");
第一种方式适合简单或单次场景,第二种方式更适合需要复用断言逻辑的场景,能让测试代码更整洁。
内容的提问来源于stack exchange,提问作者Chen
相关产品推荐
相关产品推荐

