2017-08-14 164 views
1

我正在測試一個名爲generateRandomByteInRange的函數。 它失敗了,我想看看它得到的確切值(不僅僅是它小於-127)。 我試圖用try-catch來包圍斷言,當它無法打印到控制檯時,卻什麼也沒有發生。Hamcrest - 打印到控制檯

功能 -

byte generateRandomByteInRange(int minVal,int maxVal) { 
    Random rnd; 
    rnd = new Random(); 
    return (byte) (rnd.nextInt(maxVal - minVal + 1) + minVal); 
} 

測試 -

@Test 
public void generateRandomByteInRange() { 
    int res; 
    int minVal,maxVal; 

    minVal = 1; 
    maxVal = 3; 
    for (int i = 0; i < 100; i++) { 
     res = AF.generateRandomByteInRange(minVal, maxVal); 
     assertThat(res, is(both(greaterThanOrEqualTo(minVal)).and(lessThanOrEqualTo(maxVal)))); 
    } 

    minVal = -127; 
    maxVal = 128; 
    for (int i = 0; i < 1000; i++) { 
     res = AF.generateRandomByteInRange(minVal, maxVal); 
     try { 
      assertThat(res, is(both(greaterThanOrEqualTo(minVal)).and(lessThanOrEqualTo(maxVal)))); 
     } catch (Exception e) { 
      System.out.println(res); 
     } 

    } 
} 

測試失敗,我得到以下信息(中右)

enter image description here

回答

4

Hamcrest並不總是做最大的工作來報告你的價值。如果仔細看看所獲得的斷言消息(爲了強調而添加了粗體),您會發現-128實際上是違規價值。您可以通過將res = AF.generateRandomByteInRange(minVal, maxVal)更改爲某些硬編碼錯誤值(例如res = 400)並觀察斷言消息來進行確認。

java.lang.AssertionError: Expected: is (a value equal to or greater than <-127> and a value less than or equal to <128>) but: a value equal to or greater than <-127><-128> was less than <-127>

關於你試圖捕捉異常 - 雖然有點多餘(見上),但你有一個好主意,但你發現了一個錯誤的例外。當斷言失敗時,拋出AssertionError。這是一個未經檢查的例外情況,因此它擴展了java.lang.Error而不是java.lang.Exception,這是您試圖捕獲的。只需用明確的AssertionError(或其基類之一)替換它,你應該沒問題。

+1

你可以補充,不要忘記** rethrowing **這個例外。你仍然希望測試失敗,不是嗎。忽視* *通過*測試實際上向控制檯輸出了一個錯誤並沒有意義,於是忘記了那個錯誤。 – GhostCat