圖 3演示了一個緩存管理系統,負責把經常使用的對象存儲在緩存中,以提高系統的性能。這個緩存管理系統由一個接口(CacheManager)和兩個實現(DistributedCacheManager和EmbeddedCacheManager)組成,這兩個實現分別用于Web應用程序和富客戶端應用程序。
假設需要引入一種配置方法,指導緩沖系統怎樣處理Exceptions 。如果系統處于生產階段,緩存系統中的錯誤應該不會終止系統的運行。換句話說,緩存系統拋出的任何Exception都應該忽略。另一方面,對于集成測試,我們需要獲取緩存拋出的所有Exception,對它們進行診斷并修復緩存系統中的實現缺陷。
使用Decorator Pattern(裝飾模式)可以很容易解決這個問題。我們能很容易地為任何CacheManager動態添加異常處理,作為一種靈活的繼承替換方式。
public final class IgnoreExceptionsCacheManagerDecorator implements CacheManager { private static final Object NULL = new Object(); private static Logger logger = Logger.getAnonymousLogger(); private final CacheManager decorated; public IgnoreExceptionsCacheManagerDecorator(CacheManager decorated) { this.decorated = decorated; } public Object getFromCache(String key) { try { return decorated.getFromCache(key); } catch (Exception e) { logger.log(SEVERE, "Unable to retrieve an object using key \"" + key + "\"", e); } return NULL; } public void putInCache(String key, Object o) { try { decorated.putInCache(key, o); } catch (Exception e) { logger.log(SEVERE, "Unable to store the object " + o + " using key \"" + key + "\"", e); } } }為了避免緩存系統中的任何錯誤導致產品中某些應用程序停止運行,我們僅需要使用IgnoreExceptionsCacheManagerDecorator :
CacheManager cacheManager = new IgnoreExceptionsCacheManagerDecorator(new DistributedCacheManager());
以下代碼演示了如何使用Mock(和EasyMockTemplate)來測試IgnoreExceptionsCacheManagerDecorator :
public class IgnoreExceptionsCacheManagerDecoratorTest { private IgnoreExceptionsCacheManagerDecorator decorator; private CacheManager decoratedMock; @Before public void setUp() { decoratedMock = createMock(CacheManager.class); decorator = new IgnoreExceptionsCacheManagerDecorator(decoratedMock); } @Test public void shouldNotPropagateExceptionFromCache() { final String key = "name"; final RuntimeException exception = new RuntimeException();
文章來源于領測軟件測試網 http://www.kjueaiud.com/