我开始使用Fluent Assertions并且我非常喜欢它,但想知道是否可以像这样以一般方式扩展现有测试:
hasSizeAtLeast(int limit)
GroupAssert
startsWithIgnoringCase(String prefix)
StringAssert
x.either().isIn(someSet).or().isNull()
这些只是我可能需要的例子。我可以为每一个做一些解决方法,但后来我失去了可读性和易于使用流畅的界面。
我的最后一个示例意味着抛出iff x.isIn(someSet)
和x.isNull()
。
答案 0 :(得分:1)
作者提到了a post关于打开用于扩展已处理类型的断言的API的问题。第1课特别讨论了对未完成类的更改。该帖子还提供了将StringAssert
细分为MyStringAssert
的示例。
但是,看起来您不能以保持API“流畅性”的方式扩展StringAssert
等类。 StringAssert
类不是最终的,但它仍然不允许您在子类中参数化其类型(即StringAssert
本身中的方法返回的“this”类型)。例如,假设您在checkFoo
中添加方法MyStringAssert
。如您所发现,以下内容无效,因为原始StringAssert
方法返回StringAssert
:
new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error!
你只能先调用你的子类的方法,这是有效但有点蹩脚:
new MyStringAssert("abcd").checkFoo().contains("a"); // compiles
您可以考虑与作者联系,甚至提交补丁到他的git项目。一种可能的解决方案是将参数化类型添加回StringAssert
,并通过StringAssert
内的匿名子类提供Assertions.assertThat(String)
具体类型,无论如何这是推荐的入口点。然后,其他人可以按照您的描述继承StringAssert
。我也没有测试过这个建议,但似乎有道理......