我开始使用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子类化。我也没有测试这个建议,但这似乎是有道理的...

07-27 13:50