Hamcrest - 打印到控制台

时间:2017-08-14 13:32:08

标签: java junit console hamcrest println

我正在测试一个名为generateRandomByteInRange的函数。 它失败了,我想看到它得到的确切值(而且不仅仅是它小于-127)。 我尝试用try-catch包围断言,当它无法打印到控制台但没有发生任何事情。

功能 -

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

1 个答案:

答案 0 :(得分:4)

Hamcrest在报告您的价值方面并不总是做得最好。如果你仔细看看你得到的断言消息(为强调添加了粗体),你会发现-128实际上是违规值。您可以通过将res = AF.generateRandomByteInRange(minVal, maxVal)更改为某个错误的硬编码值(例如res = 400)并观察断言消息来确认这一点。

  

java.lang.AssertionError:   预期:是(等于或大于&lt; -127的值和小于或等于&lt; 128&gt;的值)        但是:等于或大于&lt; -127&gt;的值。 &lt; -128&gt; 小于&lt; -127&gt;

关于你试图捕获异常 - 虽然有些多余(见上文),你有一个好主意,但你发现了错误的异常。当断言失败时,抛出AssertionError。这是一个未经检查的例外情况,因此它会扩展java.lang.Error而不是java.lang.Exception您尝试捕获的内容。只需将其替换为AssertionError(或其基类之一)的显式捕获,您应该没问题。