【发布时间】:2012-03-02 20:45:51
【问题描述】:
我正在尝试编写一个 Java 单元测试来测试调用终结器对对象的影响。
为了确保调用终结器,我使用了我在 stackoverflow 其他地方看到的 WeakReference 方法。
我的问题是,在这个测试中,TestFinalizer 的 finalize 方法永远不会被调用,即使 WeakReference 仅在一次迭代后就变为 null:
public class FinalizerTest {
private static class TestFinalizer {
public static class Callback {
public int NumFinalize = 0;
public void finalized(){
NumFinalize++;
}
}
private Callback callback;
public TestFinalizer(Callback callback){
this.callback = callback;
}
@Override
public void finalize() throws Throwable {
callback.finalized();
super.finalize();
}
}
@Test
public void testForceFinalizer(){
TestFinalizer.Callback callback = new TestFinalizer.Callback();
TestFinalizer testFinalizer = new TestFinalizer(callback);
// Try to force finalizer to be called
WeakReference<Object> ref = new WeakReference<Object>(testFinalizer);
testFinalizer = null;
int maxTries = 10000, i=0;
while (ref.get() != null && i<maxTries) {
++i;
System.gc();
}
if ( ref.get() != null )
fail("testFinalizer didn't get cleaned up within maxTries");
// Last line passes, next fails!
assertEquals("Should be exactly one call to finalizer", 1, callback.NumFinalize);
}
}
【问题讨论】:
标签: java unit-testing finalizer finalize