簡體   English   中英

JUnit測試斷言

[英]JUnit testing assertions

我需要為以下代碼構建Junit測試用例,並且嘗試使其中一個測試測試assert s1 != null : "Violation of: s1 is not null"; assert s2 != null : "Violation of: s2 is not null"; ,並assert s1.length() >= 1 : "|s1| >= 1"; 傳遞空序列或s1的長度> = 1時,語句會產生錯誤。

我不知道執行此操作的確切方法。

幾個論壇建議使用“嘗試捕獲”,但我不完全知道它是如何工作的。

任何幫助,將不勝感激!

public static void itersmooth(Sequence<Integer> s1, Sequence<Integer> 
    s2){
  assert s1 != null : "Violation of: s1 is not null";
  assert s2 != null : "Violation of: s2 is not null";
  assert s1.length() >= 1 : "|s1| >= 1";
  s2.clear();
  if (s1.length() > 1){
    int inp1 = 1;
    for (int inp2 = 0; inp2 < (s1.length() - 1); inp2++){
      int valone = s1.remove(inp2);
      int valtwo = s1.remove(inp1 - 1);
      int valoneT = valone / 2;
      int valtwoT = valtwo / 2;

      int valtemp = valoneT + valtwoT;
      if ((valone % 2 != 0 || valtwo % 2 != 0) && (valone > 0 && valtwo > 0)) {
        valtemp++;
      }
      if ((valone % 2 != 0 || valtwo % 2 != 0) && (valone < 0 && valtwo < 0)){
        valtemp--;
      }
      s2.add(inp2, valtemp);
      s1.add(inp2, valone);
      s1.add(inp1, valtwo);
      inp1++;
    }
   }
 }

我不會使用Java的斷言來防止null引用,主要是因為可以(默認情況下)關閉該功能。 如果您的測試系統啟用了斷言,而生產系統未啟用斷言,則可能導致真正難以發現的錯誤。

相反,我將為此使用諸如Guava PreconditionsApache Commons Validate之類的前提條件庫。 除此之外,我還將使用“ NotNull”注釋 (例如javax.annotation.Nonnull對方法參數進行注釋 ,以便客戶端代碼將在現代IDE中獲得編譯時保護。

因此,方法簽名和保護條件將如下所示(使用Commons Validate):

import org.apache.commons.lang3.Validate;
import javax.annotation.Nonnull;

//...
public static void itersmooth(@Nonnull Sequence<Integer> s1, 
                              @Nonnull Sequence<Integer> s2) {
       Validate.notNull(s1, "Violation of: s1 is not null");
       Validate.notNull(s2, "Violation of: s2 is not null");
       Validate.isTrue(s1.length() >= 1, "|s1| >= 1");

       // ...
   }

進行此更改之后,編寫單元測試很簡單,因為可以保證該方法會拋出一個NullPointerException ,從而使notNull檢查失敗,或者IllegalArgumentException ,從而使isTrue檢查失敗; 您無需擔心斷言是否啟用。

用於檢查傳入的第一個參數不能為null的示例測試如下所示:

@Test(expected=NullPointerException.class)
public void throwsWhenFirstSequenceIsNull() {
    MyClass.itersmooth(null, new Sequence<Integer>(1,2,3));
    Assert.fail("Null argument didn't cause an exception!");
}

我完全同意另一個答案,但有一個細微的變化:如果您更喜歡添加對guava或apache之類的外部庫的依賴的解決方案,那么Java自Java7起就具有很好的“內置”特性。

您可以更換

assert s1 != null : "Violation of: s1 is not null";

Objects.requireNonNull(s1, "s1 must not be null");

注意:請勿混合使用兩個參數-第一個參數將檢查是否為null。

除此之外:您應該提高命名技巧。 s1和s2 ...毫無意義。 他們沒有告訴讀者有關這兩個變量的目的的任何信息。 該方法中的大多數其他名稱相同。 嘗試使用提供有關變量背后目的的信息的名稱!

除此之外:您的整個代碼非常難以閱讀。 它看起來過於復雜; 甚至在閱讀了5次之后; 我仍然不知道該怎么辦。

因此, 真正的答案是:您絕對想學習簡潔的代碼 (例如,通過閱讀Robert Martin的書),以便在水平上進行改進。 這些斷言只是源代碼中許多其他問題的一方面...

在測試類中使用@Rule

@Rule
public ExpectedException exception = ExpectedException.none();   

public void testCase() {
    exception.expect(AssertionError.class);
    MyClass.itersmooth(null, new Sequence<Integer>(1,2,3));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM