我开始使用Fluent Assertions,我非常喜欢它,但是想知道是否有可能以这种通用方式扩展现有测试:
在hasSizeAtLeast(int limit)
中添加方法GroupAssert
在startsWithIgnoringCase(String prefix)
中添加方法StringAssert
使用x.either().isIn(someSet).or().isNull()
之类的替代方法
这些只是我很快需要的示例。我可以为它们中的每一个做一些解决方法,但是随后我失去了流畅性和易读性以及易用的界面。
我的最后一个例子是要同时x.isIn(someSet)
和x.isNull()
一起执行。
最佳答案
这是作者的a post关于打开他的API来扩展对已处理类型的断言的信息。第1课特别讨论了对未完成课程的更改。该帖子还提供了将StringAssert
子类化为MyStringAssert
的示例。
但是,您似乎无法以维持API“流畅性”的方式扩展诸如StringAssert
之类的类。 StringAssert
类不是最终的,但仍然不允许您在子类中参数化其类型(即,由StringAssert
本身的方法返回的“ this”类型)。例如,假设您在checkFoo
中添加方法MyStringAssert
。如您所见,以下内容无效,因为原始的StringAssert
方法返回StringAssert
:
new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error!
您只能先调用子类的方法,这是有效的,但是有点la脚:
new MyStringAssert("abcd").checkFoo().contains("a"); // compiles
您可以考虑与作者联系,甚至向其git项目提交补丁。可能的解决方案是将参数化类型添加回
StringAssert
,并通过StringAssert
中的匿名子类提供Assertions.assertThat(String)
具体类型,这还是建议的入口点。然后,其他人都可以像您描述的那样为StringAssert
子类化。我也没有测试这个建议,但这似乎是有道理的...