JUnit延迟断言消息创建

3
我正在使用JUnit断言消息来输出一些调试信息:

(我正在使用JUnit断言消息来输出一些调试信息)

assertEquals(debugString, a, b);

创建这个字符串的成本很高,我希望只有在断言失败时才创建它。我该怎么做?


JUnit的标准Assert不支持惰性创建错误消息。你看过Hamcrest了吗?据我所知,它具有漂亮的错误消息,只有在测试失败时才会创建。 - Stefan Birkner
@StefanBirkner 我没有。看起来不错。请给出一个答案。 - leventov
4个回答

2

这有点像是一个hack,但你可以使用iffail来模拟所有的断言。例如,不要写:

assertEquals(debugString, a, b);

您的测试可能有以下情况:

if (!a.equals(b)) {
    fail (debugString);
}

1
你可以使用 Hamcrest,据我所知它只会在失败时创建消息。
String x ="x";
String y="y";
assertThat(x, is(equalTo(y));

如果发生故障,它会生成

java.lang.AssertionError: 
Expected: is "y"
     but: was "x"

1
为了完整性,一旦JUnit 5可用,您将能够使用函数参数创建消息,仅在断言失败时进行评估。其形式可能类似于以下内容:
 assertTrue(() -> expensiveMessage(), testResult == expectedResult);

0

你可以捕获 AssertionError,然后使用你的消息重新抛出它。当消息创建移出循环时,我刚写的一些示例代码快了100多倍:

@Test
public void shouldHaveCorrectParameters() {
  for(int r = 1; r <= 50; r++) {
    for(int mce = 1; mce <= 64; mce++) {
      Encoder encoder = new Encoder(r, mce);

      for(int l = 1; l <= 16384; l++) {
        EncodeParameters params = encoder.determineParameters(l);
        double effectiveRedundancy = (params.n - params.k) * 100 / (double)params.k;

        try {
          assertTrue(params.n - params.k >= mce);
          assertTrue(params.n - params.k <= mce * 2);
          assertTrue(effectiveRedundancy >= r);
        }
        catch(AssertionError e) {
          String msg = "redundancy=" + r + "%; minimumCorrectableErrors=" + mce + "; fileLength=" + l + "; k=" + params.k + "; n=" + params.n + String.format("; effectiveRedundancy=%.3f%%", effectiveRedundancy);

          throw new AssertionError(msg, e);
        }
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接