AssertJ是否存在可返回被测原始对象的断言谓词?
AssertJ获取原始对象的实现方案
AssertJ本身没有直接提供名为getOriginalObject()的方法,但可以通过以下两种方式实现你的需求:
方法一:用asInstanceOf()转回原对象类型
在断言链中通过asInstanceOf()方法将断言对象转回原始类型,就能继续后续操作,示例代码:
CLS cls = assertThat(new CLS(a, b, c)) .extracting("property1", "property2").isEqualTo(x, y) .asInstanceOf(InstanceOfAssertFactories.type(CLS.class)); assertThat(cls.method(n)).predicates();
方法二:自定义断言类(适合高频场景)
如果需要频繁做这类初始状态验证+保留原对象的操作,建议自定义针对CLS的断言类,封装逻辑同时提供获取原对象的入口:
public class CLSAssert extends AbstractAssert<CLSAssert, CLS> { public CLSAssert(CLS actual) { super(actual, CLSAssert.class); } public static CLSAssert assertThat(CLS actual) { return new CLSAssert(actual); } // 封装初始状态验证逻辑 public CLSAssert hasInitialState(Object x, Object y) { isNotNull(); assertThat(actual.property1()).isEqualTo(x); assertThat(actual.property2()).isEqualTo(y); return this; // 返回断言实例,支持链式调用 } // 获取原始对象 public CLS get() { return actual; } }
使用方式更简洁:
CLS cls = CLSAssert.assertThat(new CLS(a, b, c)) .hasInitialState(x, y) .get(); assertThat(cls.method(n)).predicates();
额外优化:无需单独存变量的写法
如果不需要单独保存原对象变量,也可以直接在断言链内完成后续验证:
assertThat(new CLS(a, b, c)) .extracting("property1", "property2").isEqualTo(x, y) .asInstanceOf(InstanceOfAssertFactories.type(CLS.class)) .satisfies(cls -> assertThat(cls.method(n)).predicates());
内容的提问来源于stack exchange,提问作者gph
相关产品推荐
相关产品推荐

