2011-07-11 85 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