使用Java 8 Lambda清理JUnit Throwable-Tests
最近,我參與了一個關于twitter和google +的簡短在線討論,其中涉及一個問題,即Java 8 Lambda表達式的到來為什么使catch-exception庫 1過時了。 這是由簡短的聲明觸發的,該聲明將不再維護該庫,因為lambda將使其變得多余。
我當時想出的答案與 Rafa?Borowiec在他寫得很好的文章《 JUNIT:使用JAVA 8和LAMBDA表達式測試例外》中提出的答案有很多共同點。 但是,讓這兩種方法都重新考慮一下,我相信就干凈代碼而言,甚至可以做得更好。
因此,這篇文章是對該主題的引用,它分享了我的最新考慮,并簡要地解釋了一個稍微完善的解決方案。 這樣,我希望很快就能發現薄弱環節……
動機
在編寫測試時,我總是盡力在測試方法中以清晰可見的方式將布置/動作/聲明 2個階段分離開來(我的印象是,越來越多的人通過使用空白來視覺強調這些階段)行作為分隔符)。
現在,在我看來,上面提到的catch-exception解決方案或多或少地將行為和斷言階段混合在一起。 這是因為兩個都聲稱Throwable在仍處于動作階段時已被拋出。 但是斷言顯然屬于斷言階段。
幸運的是,這個問題很容易解決。
細化
讓我們看一個簡單的示例,以解釋改進的方法的外觀。 我從一個類開始,該類提供了一個IllegalStateException的方法以進行演示:
public class Foo {static final String ERR_MESSAGE = "bad";public void doIt() throws IllegalStateException {throw new IllegalStateException(ERR_MESSAGE);} }下一個代碼片段引入了一個小助手,該助手負責捕獲在JUnit測試的操作階段拋出的Throwable 。 請注意,它本身不會聲明任何內容。 它僅返回捕獲的Throwable如果有),否則返回null 。
public class ThrowableCaptor {public interface Actor {void act() throws Throwable;}public static Throwable captureThrowable( Actor actor ) {Throwable result = null;try {actor.act();} catch( Throwable throwable ) {result = throwable;}return result;} }為了強調ThrowableCaptor用于處理JUnit Test的動作階段, captorThrowable方法采用了Actor類型的參數–誠然,它可能會比喻過期一些……
無論如何,有了該實用程序, AssertJ用于干凈的匹配器表達式,靜態導入和手頭的Java 8 lambda,異常測試可能看起來像這樣:
public class FooTest {@Testpublic void testException() {// arrangeFoo foo = new Foo();// actThrowable actual = captureThrowable( foo::doIt );// assertassertThat( actual ).isInstanceOf( IllegalStateException.class ).hasMessage( Foo.ERR_MESSAGE );} }為了澄清起見,我添加了一些注釋,以描述測試方法中三個階段的明確分離。 如果沒有拋出異常,則assert塊將以斷言錯誤來退出此過程,并指出“期望實際值不為null” 3 。
結論
通過將Throwable存在檢查從行為轉移到斷言階段,基于Java8 lambda表達式的catch-exception方法允許以一種非常簡潔的方式編寫此類測試-至少從我當前的角度來看。
所以你怎么看? 我想念什么嗎?
翻譯自: https://www.javacodegeeks.com/2014/07/clean-junit-throwable-tests-with-java-8-lambdas.html
總結
以上是生活随笔為你收集整理的使用Java 8 Lambda清理JUnit Throwable-Tests的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos 下载(冰河群集ddos下载)
- 下一篇: Gradle善良:获得更多的依赖性见解