2015-08-08 46 views
0

基於配置標誌(例如-ea),可以選擇性地啓用/禁用Java斷言語句。我使用JUnit斷言(例如Assert.assertTrue)在線閱讀,您無需擔心自己管理斷言配置。這到底是什麼意思?或者:JUnit斷言是否被禁用?

1)JUnit斷言(與Prod代碼混合在一起)從不禁用。它們的行爲與Validate語句一樣,並且始終可以運行。

2)運行JUnit測試時JUnit測試框架自動啓用所有JUnit斷言。每當應用程序/代碼在JUnit外部運行時,JUnit斷言方法都不會執行任何操作。

3)JUnit斷言總是啓用默認/禁用的,但可以用來禁用自定義配置/標記/讓他們

這上面是真的嗎?

-

編輯:改變措辭一點點地清除任何歧義。

+5

JUnit測試永遠不會部署到生產(因爲他們不是應用程序的一部分),所以它沒關係。 –

+3

JUnit應當只用於單元測試,而不是督促 – Dici

+3

JUnit斷言和Java斷言過完全不同的事情。在單元測試中,JUnit斷言是簡單的方法調用。它們不存在於不使用JUnit的生產代碼中。 –

回答

2

這個問題似乎已經打開了一罐蠕蟲至於編碼-準則時使用/不使用斷言。我將在這裏發佈關於是否禁用JUnit Assert語句的直接問題的答案。再往下,你會發現關於使用斷言的哲學方面的討論。


摘要:JUnit的斷言語句是從未禁用,在生產與禁用,斷言標誌運行時也是如此。

實驗:創建一個小的主函數,它在第一行中引發錯誤。錯誤以各種不同的方式實現。通過拋出異常IllegalArgument mvn clean package; java $JAVA_OPTS -cp ....

  1. 引起的誤差:然後我跑在命令行應用程序,像這樣。應用程序失敗,出現IllegalArgument異常。

  2. 通過添加assert false引發的錯誤並運行啓用斷言(-ea)。申請失敗。

  3. 引起的誤差通過添加assert false就跑使用斷言禁用(-da)。應用程序成功。

  4. 通過添加Assert.assertTrue(false);引發錯誤並運行斷言啓用(-ea)。應用程序因AssertionError失敗。

  5. 通過添加Assert.assertTrue(false);引發錯誤,並運行斷言禁用(-da)。應用程序因AssertionError失敗。

做了一個快速谷歌搜索,看看是否有任何方法來禁用JUnit.Asserts。沒有找到任何東西。如果有人知道這樣做的方式,請讓我知道,因爲我相信這是一個重要的區別。

結論:assert關鍵字可以使用命令行-ea標誌來啓用/禁用。 JUnit.Asserts不能啓用/禁用。如果你想把斷言添加到你的生產代碼中,那麼這成爲一個非常重要的區別。如果您想要禁用它們,請使用assert關鍵字。如果你想,你知道會始終啓用的東西,然後再考慮JUnit.Assert,或拋出AssertionErrors一些其他類似的框架。


至於背後斷言使用的理念:

  1. 這是很好的某種形式的聲明添加到您的產品代碼。請參閱:https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#usage

將斷言放入代碼中。有許多情況下這是好事,使用斷言,包括: 內部不變 控制流不變量 前提條件,後置條件和類不變量

  • JUnit的斷言不能視爲java assert關鍵字的通用替代品。後者給你禁用它們的權力,而前者不會。因此,在選擇使用哪兩種設計時有設計選擇。

  • 異常和斷言服務非常不同的目的,不應該互換使用。以下的討論闡明瞭這一點進一步:When to use an assertion and when to use an exception


  • 相關的StackOverflow討論:

    assert vs. JUnit Assertions

    +0

    海事組織,你的結論是錯誤的。生產代碼中不應該使用'* .junit。*'包中的類(JUnit是一個測試框架)。如果你想運行時斷言,我寧願使用'assert'(我不喜歡)或另一個框架(例如http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/ UTIL/Assert.html)。當然,在技術上可以使用這些類 - 正如你寫的代碼約定/指導方針一樣...... – home

    +0

    @home就這樣我們在同一頁面上:假設你想要一個永不停用的斷言,是嗎?任何功能原因不在生產中使用JUnit.assert?我假設你的反對意見是哲學的(JUnit類只應該用於測試),而不是功能性的。 – RvPr

    +0

    @home除了spring.Assert,還有其他的assert-framework與JUnit一樣好嗎?與使用JUnit.Assert相同的原因,在與Spring不相關的代碼中使用spring.assert似乎也同樣噁心。使用assert關鍵字看起來很痛苦,因爲它是非描述性錯誤消息,缺少JUnit.Assert提供的功能。 – RvPr

    1

    我認爲你對JUnit斷言和Java的內置斷言感到困惑。

    1. JUnit斷言是拋出一個異常AssertionError,應該只在您的測試代碼中使用的方法。只有在構建期間/構建期間運行JUnit測試時,才應該在生產中使用JUnit代碼。方法名稱的名稱類似assertEquals(expected, actual)assertNull(Object)等。您不能禁用這些斷言,因爲它們是方法調用。此外,如果您可以禁用所有JUnit斷言方法調用,那麼您的測試代碼將毫無用處。

    2. Java的內置斷言是一個以assert關鍵字開頭的布爾表達式。如果表達式返回false,那麼它也會拋出一個AssertionError。這種斷言可以在生產中被禁用,以幫助加快你的代碼或開啓幫助追蹤錯誤。你可以閱讀更多關於Java構建斷言in the Java Programming Guide

    +0

    當你說「JUnit斷言只應用於測試代碼」時,你是說它們應該只用於單元內部/集成測試?如果是這樣,這似乎與這裏給出的建議嚴重衝突:http://stackoverflow.com/questions/1957645/when-to-use-an-assertion-and-when-to-use-an-exception Ie ,斷言可以/應該放在你的生產代碼中,以維護某些代碼不變量 – RvPr

    +0

    @RvPr這個問題是關於* Java *斷言,而不是JUnit斷言。是的,JUnit通常不用於生產代碼。 JUnit斷言用於測試。 –

    +0

    @MthetheFFwell您建議我們在測試代碼中使用JUnit Asserts,並在生產代碼中聲明關鍵字? – RvPr