2015-01-06 71 views
2

如果我想測試輸入是否有效,如何使用JUnit4測試該方法是否處理非法輸入/參數?測試JUnit中方法的合法和非法參數

要調用setAge()方法,參數必須是整數而不是char或string。

@Test 
public void testWHetherInputValid() { 
    Person p = new Person(); 
    String s = "abc"; 
    p.setAge(s); // but actually, the correct input must be an integer 
} 
+0

什麼是'setAge'認爲如果給予無效的輸入呢?一旦你知道了,你可以測試它。 –

+0

在這種情況下,不是測試你的'setAge'方法,最好是測試你的輸入處理和轉換方法,因爲如果參數是一個int,它不應該編譯 – Abbath

+1

你可以使用@Pattern註釋,然後 使用hibernate驗證器驗證 - validator.validate(p); – panagdu

回答

0

這取決於你如何聲明你的setAge方法。在你提到看來情況下,你宣佈它是這樣的:

public void setAge(String s) 

,但如果你有興趣只是接收有效數字,爲什麼你接受擺在首位String

無論如何,假設您的setAge的聲明是您因某種原因而做出的聲明,那麼我已經完成這項工作的方式是通過檢查是否在違反我的邏輯的行中引發異常。所以,如果拋出異常,我繼續進行其他檢查,但如果不拋出,則setAge中的某些內容會變得不正確,並且會使測試失敗。

我的建議是你聲明setAge只接收數字(int也許),然後編譯器會避免你的方法的幾個無效使用。如果您收到一些無效號碼,比如說-1,那麼您會拋出RuntimeException其中一個子類的異常,告知輸入不是預期的。

+0

真的很有幫助,謝謝 –

5

如果setAge收到int,寫一個測試將通過一個String它是沒有意義的 - 這樣的調用甚至不會編譯。

測試用於捕獲編譯器無法檢測到的運行時錯誤。例如,我們假設Person的年齡必須是正整數。路過-1應,例如,導致函數拋出IllegalArgumentException - 這可以通過在@Test註解中指定期望的異常進行測試:

@Test(expected = IllegalArgumentException.class) 
public void testWHetherInputValid() { 
    Person p = new Person(); 
    int invalidAge = -1; 
    p.setAge(invalidAge); 
} 
1

如果你有ň條件你想在一個測試來表達,您有n測試。

現在,如果您的方法寫入正確(即只接受int作爲參數),那麼您不需要測試該方法; Java會在編譯時通知你你的錯誤。

如果你接受一些其他類型的對象作爲參數(親愛的上帝爲什麼?!),那麼這取決於它是如何實現的。

  • 如果您接受String,你也很難期望它是一個整數(即「123」,而不是「123.2」),然後利用Integer#parseInt和彈了出來,當你得到一個IllegalArgumentException。測試這個異常是否被拋出。

    @Test(exception=IllegalArgumentException) 
    public void testSetAgeWithInvalidNumeralString { 
        // exercise your code 
    } 
    
  • 如果您接受int,那麼你可能想要做邊界檢查。你會總是得到一個int在那裏,所以你不妨找一些更有價值的驗證。