[英]Extending fluent interface
我开始使用Fluent Assertions ,我非常喜欢它,但想知道是否可以像这样以一般方式扩展现有测试:
GroupAssert
中添加方法hasSizeAtLeast(int limit)
StringAssert
中添加方法startsWithIgnoringCase(String prefix)
x.either().isIn(someSet).or().isNull()
类的替代方法这些只是我可能很快需要的例子。 我可以为它们中的每一个做一些解决方法,但是我失去了流畅界面的可读性和易用性。
我的最后一个示例旨在抛出当且仅当x.isIn(someSet)
和x.isNull()
都这样做的时候。
这是作者关于打开他的 API 以扩展已处理类型的断言的帖子。 第 1 课特别讨论了取消最终确定类的更改。 该帖子还提供了一个将StringAssert
子类化为MyStringAssert
的示例。
但是,您似乎无法以保持StringAssert
的“流畅性”的方式扩展诸如 StringAssert 之类的类。 StringAssert
class 不是最终的,但它仍然不允许您在子类中参数化其类型(即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
。 我也没有测试过这个建议,但它似乎是有道理的......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.