2017-08-14 165 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