我开始使用Fluent断言,我很喜欢它,但想知道是否有可能以这样的一般方式扩展现有的测试:
- 在
GroupAssert
中添加hasSizeAtLeast(int limit)
方法 - 在
StringAssert
中添加 - 使用
x.either().isIn(someSet).or().isNull()
等替代品
startsWithIgnoringCase(String prefix)
方法这些只是我可能很快需要的例子。我可以为它们做一些变通,但这样我就失去了流畅界面的可读性和易用性。
我的最后一个例子是为了抛出x.isIn(someSet)
和x.isNull()
。
这是作者的一篇关于开放他的API以在已经处理的类型上扩展断言的文章。第1课特别讨论了取消finalize类的更改。文章还给出了一个将StringAssert
子类化为MyStringAssert
的例子。
然而,看起来你不能以一种保持API"流畅性"的方式扩展像StringAssert
这样的类。StringAssert
类不是最终的,但它仍然不允许你在子类中参数化它的类型(即StringAssert
本身的方法返回的"this"类型)。例如,假设您在MyStringAssert
中添加了一个方法checkFoo
。正如您所发现的,由于原来的StringAssert
方法返回StringAssert
,下面的代码是无效的:
new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error!
你只能先调用你的子类的方法,这是有效的,但有点蹩脚:
new MyStringAssert("abcd").checkFoo().contains("a"); // compiles
你可以考虑联系作者,或者甚至向他的git项目提交一个补丁。一种可能的解决方案是将参数化类型添加回StringAssert
,并通过Assertions.assertThat(String)
中的匿名子类提供StringAssert
具体类型,这是推荐的入口点。然后,每个人都可以按照您的描述创建StringAssert
的子类。我也没有测试过这个建议,但它似乎是有意义的…