1

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

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

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

我的最后一个示例旨在同时抛出 iffx.isIn(someSet)x.isNull()do。

4

1 回答 1

2

这是作者关于开放他的 API 以扩展已处理类型的断言的帖子。第 1 课特别讨论了取消最终确定类的更改。这篇文章还给出了一个子分类的StringAssert例子MyStringAssert

但是,您似乎无法StringAssert以保持 API“流畅性”的方式扩展类。该类StringAssert不是最终的,但它仍然不允许您StringAssert在子类中参数化它的类型(即方法本身返回的“this”类型)。例如,假设您checkFooMyStringAssert. 如您所见,以下内容无效,因为原始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按照您的描述进行子类化。我也没有测试过这个建议,但它似乎是有道理的......

于 2011-07-15T04:10:22.017 回答