2011-07-11 64 views
1

我使用Fluent Assertions开始,我喜欢它了很多,但不知道是否有可能在这样一个普通的方式扩展现有的测试:扩展流畅的界面

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

这些只是Ë xamples什么我可能需要很快。我可以为他们每个人做一些解决方法,但是然后我失去了流畅界面的可读性和易用性。

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

+0

我会理解**无论是...或... **作为异或连接,即它应该抛出如果只是一个他们抛出。 (但我不是母语为英语的人) –

+0

我也不是,但我认为你不完全正确。 AFAIK,当你想强调选择的存在时,“或者 - 或者”也可以被使用。 'hamcrest'也以这种方式使用它。 – maaartinus

+0

链接到流利的断言是404。 –

回答

1

这里是a post作者关于打开他的API扩展已处理类型的断言。第1课特别讨论了对未完成类的更改。这篇文章还给出了一个分类为MyStringAssert的例子。

但是,它看起来像不能扩展类,如StringAssert维护API的“流畅性”的方式。 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。我还没有测试过这个建议,但它似乎是有道理的...

+0

谢谢。该链接实际上表明,扩展'StringAssert'实际上不起作用,因为你不能返回'MyStringAssert'。所以你不能得到'新的MyStringAssert(“abcd”)。contains(“a”)。hasSizeAtLeast(3);'使用继承工作。 – maaartinus

+0

嗯,你说得对。对于混淆道歉,我应该先尝试一下!我会回应消除错误信息并提供一些建议。 – jtoberon

+0

没问题,你帮了我很多,因为我对从哪里开始一无所知。我很确定你的建议是有道理的。遗憾的是,Java仅为[自我类型](http://www.jroller.com/scolebourne/entry/java_7_self_types)提供了一个非常糟糕的解决方法,迫使每个人都用其他无用的泛型参数来污染代码,或者失去灵活性。 – maaartinus