日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用Java 8 Lambda清理JUnit Throwable-Tests

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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方法允許以一種非常簡潔的方式編寫此類測試-至少從我當前的角度來看。

所以你怎么看? 我想念什么嗎?

  • 為了使異常測試更簡潔,catch-exception庫在一行代碼中捕獲異常,并使它們可用于進一步分析
  • 請參閱實用單元測試,第3.9章。 單元測試的階段,Tomek Kaczanowski 2013,通常也表示為構建-操作-檢查模式,清潔代碼,第9章。單元測試,Robert C. Martin,2009年
  • Assertion#isNotNull檢查由Assertion#isInstanceOf隱式調用,但當然也可以顯式調用
  • 翻譯自: https://www.javacodegeeks.com/2014/07/clean-junit-throwable-tests-with-java-8-lambdas.html

    總結

    以上是生活随笔為你收集整理的使用Java 8 Lambda清理JUnit Throwable-Tests的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。