[英]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 Preconditions或Apache 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.