我有一个方法,有时会抛出异常:
this.items[index] = element;
Run Code Online (Sandbox Code Playgroud)
我有一个单元测试断言应该抛出的异常实际抛出:
try
{
doSomethingWithIndex(-1);
Assert.fail("should cause exception");
}
catch (IndexOutOfBoundsException expected)
{
Assert.assertNotNull(expected.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
此测试作为连续构建的一部分运行,有时偶尔会失败,因为getMessage()实际上返回null.为什么会这样?我的代码永远不会抛出空消息的异常.
编辑
我的原始代码示例具有误导性,抛出的异常实际上来自直接索引数组.我可以使用自定义抛出异常重现相同的行为.
我添加了建议的代码:
catch (IndexOutOfBoundsException expected)
{
if (expected.getMessage() == null)
{
expected.printStackTrace();
}
Assert.assertNotNull(expected.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
除原因外,控制台输出缺少堆栈跟踪.这是完整的输出:
java.lang.ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)
找到了类似问题的答案.
如果它们足够发生,JIT编译器将在某些例外中优化掉堆栈跟踪.
JVM标志-XX:-OmitStackTraceInFastThrow可以防止此行为,并且似乎可以修复闪烁单元测试.
| 归档时间: |
|
| 查看次数: |
4402 次 |
| 最近记录: |