我正在使用JUnit断言消息输出一些调试信息:
assertEquals(debugString, a, b);
创建这个字符串很昂贵,我想只在断言失败时创建它。我怎么能这样做?
答案 0 :(得分:2)
这有点像黑客攻击,但您可以使用if
和fail
自行模拟所有断言。例如,而不是:
assertEquals(debugString, a, b);
您的测试可能有:
if (!a.equals(b)) {
fail (debugString);
}
答案 1 :(得分:1)
您可以使用Hamcrest,仅在失败AFAIK时创建消息。
String x ="x";
String y="y";
assertThat(x, is(equalTo(y));
如果发生故障,则会生成
java.lang.AssertionError:
Expected: is "y"
but: was "x"
答案 2 :(得分:1)
为了完整性,一旦JUnit 5可用,您将能够使用函数参数创建消息,该函数参数仅在断言失败时进行评估。它的形式可能是这样的:
assertTrue(() -> expensiveMessage(), testResult == expectedResult);
答案 3 :(得分: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);
}
}
}
}
}