fixed CachingMapDecorator to support garbage-collected weak references (again)

This commit is contained in:
Juergen Hoeller
2009-03-23 11:34:51 +00:00
parent 84cc32525f
commit 4708446d4a
2 changed files with 108 additions and 44 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2005 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,41 +16,91 @@
package org.springframework.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
/**
* @author Keith Donald
* @author Juergen Hoeller
*/
public class CachingMapDecoratorTests extends TestCase {
public void testValidCache() {
MyCachingMap cache = new MyCachingMap();
Object value;
assertFalse(cache.containsKey("value key"));
assertFalse(cache.containsValue("expensive value to cache"));
Object value = cache.get("value key");
assertTrue(cache.createCalled());
assertEquals(value, "expensive value to cache");
assertTrue(cache.containsKey("value key"));
assertTrue(cache.containsValue("expensive value to cache"));
assertFalse(cache.containsKey("value key 2"));
value = cache.get("value key 2");
assertTrue(cache.createCalled());
assertEquals(value, "expensive value to cache");
assertTrue(cache.containsKey("value key 2"));
value = cache.get("value key");
assertTrue(cache.createCalled());
assertFalse(cache.createCalled());
assertEquals(value, "expensive value to cache");
cache.get("value key 2");
assertFalse(cache.createCalled());
assertEquals(value, "expensive value to cache");
assertFalse(cache.containsKey(null));
assertFalse(cache.containsValue(null));
value = cache.get(null);
assertTrue(cache.createCalled());
assertNull(value);
assertTrue(cache.containsKey(null));
assertTrue(cache.containsValue(null));
value = cache.get("value key");
assertEquals(cache.createCalled(), false);
assertEquals(value, "expensive value to cache");
value = cache.get(null);
assertFalse(cache.createCalled());
assertNull(value);
cache.get("value key 2");
assertEquals(cache.createCalled(), false);
assertEquals(value, "expensive value to cache");
Set<String> keySet = cache.keySet();
assertEquals(3, keySet.size());
assertTrue(keySet.contains("value key"));
assertTrue(keySet.contains("value key 2"));
assertTrue(keySet.contains(null));
Collection<String> values = cache.values();
assertEquals(3, values.size());
assertTrue(values.contains("expensive value to cache"));
assertTrue(values.contains(null));
Set<Map.Entry<String, String>> entrySet = cache.entrySet();
assertEquals(3, entrySet.size());
keySet = new HashSet<String>();
values = new HashSet<String>();
for (Map.Entry<String, String> entry : entrySet) {
keySet.add(entry.getKey());
values.add(entry.getValue());
}
assertTrue(keySet.contains("value key"));
assertTrue(keySet.contains("value key 2"));
assertTrue(keySet.contains(null));
assertEquals(2, values.size());
assertTrue(values.contains("expensive value to cache"));
assertTrue(values.contains(null));
}
private static class MyCachingMap extends CachingMapDecorator {
private static class MyCachingMap extends CachingMapDecorator<String, String> {
private boolean createCalled;
protected Object create(Object key) {
protected String create(String key) {
createCalled = true;
return "expensive value to cache";
return (key != null ? "expensive value to cache" : null);
}
public boolean createCalled() {