2012-05-24 19 views
7

के साथ net.sf.ehcache.Cache (ehcache) मॉकिंग IHCache के साथ एक सरल कैश कार्यक्षमता विकसित कर रहा हूं। वहाँ एक सामान्य आधार वर्ग को लागू करने वाली अपने कैश इंटरफेस (BECache) है:.put विधि stub (मॉकिटो)

public class ObjectCache extends EhCacheBase<String, Object>{ 

    public ObjectCache (String cacheName) { 
     super(cacheName); 
    } 
} 

'cacheName' मानते हुए ehcache.xml में परिभाषित किया गया है:

public class EhCacheBase<K, V> implements BECache<K, V> { 

private static CacheManager cacheManager; 
private String cacheName; 

public EhCacheBase(String cacheName) { 
    this.cacheName = cacheName; 
} 

public void cache(K key, V value) { 
    Cache cache = cacheManager.getCache(cacheName); 
    if (cache == null) { 
     throw new NullPointerException("Failed to obtain cache: " + cacheName); 
    } 
    Element element = new Element(key, value); 
    cache.put(element); 
} 

उद्देश्य इस प्रकार के रूप में परिभाषित कैश है मुझे कुछ वस्तुओं को कैशिंग के लिए एक अच्छी कक्षा मिलती है।

मैं 'EhCacheBase.cache (...)' विधि है कि एक कैश लिया गया है सुनिश्चित करता है और एक मूल्य डाल दिया जाता है (Mockito का प्रयोग करके) के लिए एक परीक्षण लिखने के लिए कोशिश कर रहा हूँ:

private static final String CACHE_NAME = "testCache"; 
@Mock 
private CacheManager cacheManager; 
@Mock 
private Cache cache; 
private EhCacheBase<String, Object> ehCacheBase; 

@Before 
public void init() { 
    MockitoAnnotations.initMocks(this); 
    ehCacheBase = new EhCacheBase<String, Object>(CACHE_NAME); 
    EhCacheBase.setCacheManager(cacheManager); 
} 

@Test 
public void shouldRetrieveCacheAndPutOneValueInIt() { 
    //given 
    Object o = new Object(); 
    when(cacheManager.getCache(CACHE_NAME)).thenReturn(cache); 

    //when 
    ehCacheBase.cache("KEY", o); 

    //then 
    verify(cacheManager, times(1)).getCache(CACHE_NAME); 
    verify(cache, times(1)).put(any(Element.class)); 
} 

जब

java.lang.NullPointerException 
    at net.sf.ehcache.Cache.checkStatus(Cache.java:2731) 
    at net.sf.ehcache.Cache.putInternal(Cache.java:1440) 
    at net.sf.ehcache.Cache.put(Cache.java:1417) 
    at net.sf.ehcache.Cache.put(Cache.java:1382) 
    at org.fxoo.bookingengine.dao.dataproviders.caches.EhCacheBase.cache(EhCacheBase.java:24) 
    at org.fxoo.bookingengine.dao.dataproviders.caches.EhCacheBaseTest.shouldCacheOneValue(EhCacheBaseTest.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
    at $Proxy0.invoke(Unknown Source) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 

यह 'कैश' नकली 'में डाल' विधि की तरह लगता है कुछ अन्य लोगों के तरीकों बुला रहा है: मैं परीक्षण मैं चलाते हैं। लेकिन जैसा कि आप मॉकिटो डॉक्स में पढ़ सकते हैं:

कुछ भी करने के लिए शून्य विधियों को सेट करने के लिए doNothing() का उपयोग करें। सावधान रहें कि मोक्स पर शून्य विधियां डिफ़ॉल्ट रूप से कुछ भी नहीं करती हैं! हालांकि, कुछ भी नहीं होती है जब कुछ भी नहीं होता है (

वैसे, मैंने कोशिश की: कुछ भी नहीं()। जब (कैश) .पुट (कोई (Element.class)); और इससे कोई मदद नहीं मिली।

कोई विचार क्या चल रहा है?

+0

क्योंकि पुट (तत्व) अंतिम है, यह मजाक एक मुद्दा है:

मैं स्वीकार किए जाते हैं जवाब के उदाहरण अनुकूल नहीं बनाया है। – Zlatko

उत्तर

8

कैश.पूट अंतिम है, इसलिए यदि आप इसे मॉक करना चाहते हैं तो आपको PowerMock का उपयोग करने की आवश्यकता है।

आपका परीक्षण इस प्रकार दिखाई देगा:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Cache.class) 
public class EhCacheBaseTest { 
    private static final String CACHE_NAME = "testCache"; 
    private CacheManager cacheManager; 
    private Cache cache; 
    private EhCacheBase<String, Object> ehCacheBase; 

    @Before 
    public void init() { 
     // You can statically import mock method, but left it this way 
     // for clarity 
     cacheManager = PowerMockito.mock(CacheManager.class); 
     cache = PowerMockito.mock(Cache.class); 
     ehCacheBase = new EhCacheBase<String, Object>(CACHE_NAME); 
     EhCacheBase.setCacheManager(cacheManager); 
    } 

    @Test 
    public void shouldRetrieveCacheAndPutOneValueInIt() { 
     //given 
     Object o = new Object(); 
     when(cacheManager.getCache(CACHE_NAME)).thenReturn(cache); 

     //when 
     ehCacheBase.cache("KEY", o); 

     //then 
     verify(cacheManager, times(1)).getCache(CACHE_NAME); 
     verify(cache, times(1)).put(any(Element.class)); 
    } 
} 
3

मैंने मॉकिटो Google समूह (here) पर एक समान प्रश्न पोस्ट किया। मुझे एरिक लेफेवर-अर्दांत से त्वरित प्रतिक्रिया मिली जिसने सबकुछ समझाया। Net.sf.ehcache.Cache.put विधि अंतिम है इसलिए इसे स्टब नहीं किया जा सकता है - मॉकिटो अपना कार्यान्वयन प्रदान करने में विफल रहता है।

+0

यदि यह फ़ाइनल है, तो आप इसे मॉकिटो के विस्तार, पावरमोक के साथ नकल कर सकते हैं। –

2

Mockito का नवीनतम संस्करण (1.10.19) not supported by PowerMock है।

पावरमैक का उपयोग करने के बजाय, यदि संभव हो तो दूसरा समाधान कार्यान्वयन के बजाय net.sf.ehcache.Ehcache इंटरफ़ेस को कोड करना है।

Ehcache इंटरफ़ेस को आसानी से मानक मॉकिटो के साथ मजाक किया जा सकता है।

@RunWith(MockitoJUnitRunner.class) 
public class EhCacheBaseTest { 
    private static final String CACHE_NAME = "testCache"; 

    @Mock private Ehcache cache; 
    @Mock private CacheManager cacheManager; 

    private EhCacheBase<String, Object> ehCacheBase; 

    @Before 
    public void init() { 
     ehCacheBase = new EhCacheBase<String, Object>(CACHE_NAME); 
     EhCacheBase.setCacheManager(cacheManager); 
    } 

    @Test 
    public void shouldRetrieveCacheAndPutOneValueInIt() { 
     //given 
     Object o = new Object(); 
     when(cacheManager.getEhcache(CACHE_NAME)).thenReturn(cache); 

     //when 
     ehCacheBase.cache("KEY", o); 

     //then 
     verify(cacheManager, times(1)).getEhcache(CACHE_NAME); 
     verify(cache, times(1)).put(any(Element.class)); 
    } 
} 
+0

मुझे लगता है कि यह सही जवाब होना चाहिए – spekdrum

संबंधित मुद्दे