扩展流畅接口



我开始使用Fluent断言,我很喜欢它,但想知道是否有可能以这样的一般方式扩展现有的测试:

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

这些只是我可能很快需要的例子。我可以为它们做一些变通,但这样我就失去了流畅界面的可读性和易用性。

我的最后一个例子是为了抛出x.isIn(someSet)x.isNull()

这是作者的一篇关于开放他的API以在已经处理的类型上扩展断言的文章。第1课特别讨论了取消finalize类的更改。文章还给出了一个将StringAssert子类化为MyStringAssert的例子。

然而,看起来你不能以一种保持API"流畅性"的方式扩展像StringAssert这样的类。StringAssert类不是最终的,但它仍然不允许你在子类中参数化它的类型(即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的子类。我也没有测试过这个建议,但它似乎是有意义的…

相关内容

  • 没有找到相关文章

最新更新