我有一种方法有时会引发异常:
this.items[index] = element;
我有一个单元测试断言应该抛出的异常实际上被抛出:
try
{
doSomethingWithIndex(-1);
Assert.fail("should cause exception");
}
catch (IndexOutOfBoundsException expected)
{
Assert.assertNotNull(expected.getMessage());
}
此测试作为连续构建的一部分运行,有时偶尔会失败,因为getMessage()实际上返回null。为什么会这样?我的代码永远不会抛出带有空消息的异常。
修改
我的原始代码示例具有误导性,抛出的异常实际上来自直接索引数组。我可以使用自定义抛出异常重现相同的行为。
我添加了建议的代码:
catch (IndexOutOfBoundsException expected)
{
if (expected.getMessage() == null)
{
expected.printStackTrace();
}
Assert.assertNotNull(expected.getMessage());
}
除原因外,控制台输出缺少堆栈跟踪。这是完整的输出:
java.lang.ArrayIndexOutOfBoundsException
答案 0 :(得分:9)
在similar question找到答案。
The JIT compiler will optimize away stack traces in certain exceptions if they happen enough.
JVM标志-XX:-OmitStackTraceInFastThrow可防止此行为,并且似乎可以修复闪烁的单元测试。
答案 1 :(得分:1)
尝试在具有空消息时打印异常的堆栈跟踪。其他一些代码可能会抛出它。就像你实际访问过去的数组长度一样。
答案 2 :(得分:0)
你写道: “我的代码永远不会抛出带有空消息的异常”
你在想任何第三方图书馆吗?我假设标准的java代码永远不会抛出像上面这样的异常,但是有些pourly编码的jar ...:)