Mocking net.sf.ehcache.Cache (ehcache) with .put method stub

1,747 views
Skip to first unread message

Dzik

unread,
May 24, 2012, 4:08:03 PM5/24/12
to mockito
I' trying to write a test for the following method in EhCacheBase:

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

...

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);
}

The method is supposed to return a cached named 'cacheName' and put a
keyed value in it.

The test is supposed to check if .getCache and .put methods are
called:

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));
}

When I run the test I get:

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)

By the way, I tried: doNothing().when(cache).put(any(Element.class));
and it didn't help either.

Any ideas what is going on?

I also tried the same test with my own interfaces (no ehcache):

public interface Cache {
void put(Object o);
}

public interface CacheManager {
Cache getCache();
}

public class CacheUtils {

private CacheManager cacheManager;

public void useCache(Object o) {
Cache cache = cacheManager.getCache();
cache.put(o);
}

and the test:

@Mock
private CacheManager cacheManager;
@Mock
private Cache cache;
private CacheUtils cacheUtils;

@Before
public void init() {
MockitoAnnotations.initMocks(this);
cacheUtils = new CacheUtils();
cacheUtils.setCacheManager(cacheManager);
}

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

//when
cacheUtils.useCache(o);

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

this one works. What is wrong with stubbing net.sf.ehcache.Cache .put
method?

Eric Lefevre-Ardant

unread,
May 25, 2012, 3:31:31 AM5/25/12
to moc...@googlegroups.com
" What is wrong with stubbing net.sf.ehcache.Cache .put method?"

It seems that this method is final. Since it cannot be overridden, Mockito fails to replace it with its own implementation.
So you won't be able to stub, nor to count the number of calls made to it.


--
You received this message because you are subscribed to the Google Groups "mockito" group.
To post to this group, send email to moc...@googlegroups.com.
To unsubscribe from this group, send email to mockito+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/mockito?hl=en.


Dzik

unread,
May 25, 2012, 3:41:51 AM5/25/12
to mockito
Thanks a lot! That explains this weird behaviour.

On May 25, 9:31 am, Eric Lefevre-Ardant <e...@ericlefevre.net> wrote:
> " What is wrong with stubbing net.sf.ehcache.Cache .put method?"
>
> It seems that this method is final. Since it cannot be overridden, Mockito
> fails to replace it with its own implementation.
> So you won't be able to stub, nor to count the number of calls made to it.
>
Reply all
Reply to author
Forward
0 new messages