繁体   English   中英

扩展流畅的界面

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM