java JUnit延迟断言消息创建 16 小时,5 分钟 Questions & Answers 449 我正在使用JUnit断言消息输出一些调试信息: assertEquals(debugString, a, b); 创建这个字符串的代价很高,我只想在断言失败时创建它。我该怎么做
# 1 楼答案 这有点像黑客,但您可以使用if和fail模拟所有断言。例如,代替: assertEquals(debugString, a, b); 你的测试可能有: if (!a.equals(b)) { fail (debugString); }
# 2 楼答案 您可以捕获断言错误,然后用消息重新播放它。当消息创建移出循环时,我刚刚编写的一些示例代码的速度快了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); } } } } }
# 3 楼答案 您可以使用Hamcrest,它只在AFAIK失败时创建消息 String x ="x"; String y="y"; assertThat(x, is(equalTo(y)); 如果发生故障,它会产生 java.lang.AssertionError: Expected: is "y" but: was "x"
# 4 楼答案 为了完整性,一旦JUnit 5可用,您就可以使用函数参数创建消息,只有在断言失败时才会对函数参数进行评估。它的形式可以是这样的: assertTrue(() -> expensiveMessage(), testResult == expectedResult);
# 1 楼答案
这有点像黑客,但您可以使用
if
和fail
模拟所有断言。例如,代替:你的测试可能有:
# 2 楼答案
您可以捕获断言错误,然后用消息重新播放它。当消息创建移出循环时,我刚刚编写的一些示例代码的速度快了100多倍:
# 3 楼答案
您可以使用Hamcrest,它只在AFAIK失败时创建消息
如果发生故障,它会产生
# 4 楼答案
为了完整性,一旦JUnit 5可用,您就可以使用函数参数创建消息,只有在断言失败时才会对函数参数进行评估。它的形式可以是这样的: