【发布时间】:2016-08-22 15:26:53
【问题描述】:
我目前正在测试一个使用 Java 实现的 ACID 语义的事务系统。系统具有回调处理程序,允许在事务期间执行任意调试操作,例如抛出一个模拟错误的异常。
但是,实际上可能发生的情况是线程死亡(例如,OutOfMemoryError)或整个 JVM 死亡(sigsev 或 OS 进程终止)。我可以看到在 JUnit 测试中模拟 JVM 进程的意外关闭是不可能的(因为 JUnit 在同一个 JVM 中运行)。但是杀死一个线程呢?我知道Thread#stop(),但它已被弃用,而且在线程中抛出了ThreadDeathError。我想模拟的是一个线程的瞬时“死亡”,它甚至阻止了catch(Throwable t) 子句的触发。这可以在 Java 中完成,而不会杀死 JUnit 测试运行程序吗?
同样,这不用于生产用途,仅用于严格测试。
【问题讨论】:
-
在线程中显式抛出
OutOfMemoryError怎么样? -
好主意,但我不确定“手动”抛出的
OutOfMemoryError是否真的对 JVM 产生与“真正的”OoME 相同的效果。有人可能会争辩说,在到达 OoME 之前分配内存是一种想法,但这样一来 JUnit 测试环境也可能会被破坏...... -
或者只是尝试加载非常大的文件。 OOM 很容易复现。
-
@Nambari 不,它实际上只杀死了一个线程。我不得不与发生这种情况的系统作斗争,它似乎继续工作,但一些重要的线程刚刚消失。
-
@Nambari - Sun JRE 1.4(我没有说它是最近的......)。当线程 B 尝试分配不可用的内存时,可以很容易地设置一个测试来查看线程 A 是否保持活动状态。
标签: java multithreading unit-testing jvm kill