扩展流畅的界面

时间:2011-07-11 02:36:27

标签: java fluent-interface fest

我开始使用Fluent Assertions并且我非常喜欢它,但想知道是否可以像这样以一般方式扩展现有测试:

  • hasSizeAtLeast(int limit)
  • 中添加方法GroupAssert
  • startsWithIgnoringCase(String prefix)
  • 中添加方法StringAssert
  • 使用x.either().isIn(someSet).or().isNull()
  • 等替代方案

这些只是我可能需要的例子。我可以为每一个做一些解决方法,但后来我失去了可读性和易于使用流畅的界面。

我的最后一个示例意味着抛出iff x.isIn(someSet)x.isNull()

1 个答案:

答案 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。我也没有测试过这个建议,但似乎有道理......