java - 测试弱引用

标签 java unit-testing weak-references

在 Java 中测试弱引用的正确方法是什么?

我最初的想法是执行以下操作:

public class WeakReferenceTest {

    public class Target{
        private String value;    

        public Target(String value){
            this.value = value;
        }    
        public String toString(){
            return value;
        }
    }

    public class UsesWeakReference{    
        WeakReference<Target> reference;   

        public UsesWeakReference(Target test){
            reference = new WeakReference<Target>(test);
        }    
        public String call(){
            Target test = reference.get();
            if(test != null){
                return test.toString();
            }
            return "empty";
        }
    }

    @Test
    public void testWeakReference(){    
        Target target = new Target("42");

        UsesWeakReference usesWeakReference = new UsesWeakReference(target);    
        WeakReference<Target> triggerReference = new WeakReference<Target>(target);    
        assertEquals("42", usesWeakReference.call());

        target = null;    
        while(triggerReference.get() != null){
            System.gc();
        }

        assertEquals("empty", usesWeakReference.call());    
    }    
}

我对该方法的保留意见是使用 System.gc(),因为我知道它在不同的 JVM 上的行为可能不同。

最佳答案

没有 100% 防弹的方法来测试使用引用类型的代码。 Reference 对象的行为取决于 GC 何时运行,并且没有 100% 可靠的方法强制 GC 运行。

你能做的最好的事情是:

  • 检查您在运行测试时是否设置了正确的 JVM 选项,以及
  • 编写您的测试,使其在 System.gc() 是空操作的情况下不会失败愿意禁用或跳过测试, 或者忽略测试失败。

(您应该能够通过查看调用前后使用了多少内存来检测 System.gc() 是否被忽略;例如,通过调用 Runtime.totalMemory ())


其实还有另一种“解决办法”。让你的单元测试产生大量垃圾……足以保证你会触发垃圾收集。 (这不是个好主意,IMO。)

关于java - 测试弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11174328/

相关文章:

java - CVS - 比较时创建 Zip

unit-testing - 如何测试组件是否包含字符串?

swift - 在弱变量上使用可选链接的调用方法导致 EXC_BAD_ACCESS

用于关闭连接的 Java 弱引用

python - 如何存储回调方法?

java - 从数据库更新 float 组

java - java中多线程如何获取和释放同步方法和同步块(synchronized block)中的锁?

java - 在 Eclipse 的 GAE 插件上找不到 "Deploy app engine project"选项

java - Mock beans 与 Mockito 的 Spring Boot 单元测试

java - JUnit 预期标记未按预期工作