The PlayFramework documentation states on how to override a simple binding of a Class in your Guice Tests to another implementation, like this:
Application application = new GuiceApplicationBuilder()
.overrides(bind(Component.class).to(MockComponent.class))
.build();
If you’re using the CacheApi in your tests, you might stumble upon this kind of error:
Error in custom provider, net.sf.ehcache.ObjectExistsException: Cache cmsCache already exists at play.api.cache.EhCacheModule.play$api$cache$EhCacheModule$$bindCache$1(Cache.scala:178): Binding(interface net.sf.ehcache.Ehcache qualified with QualifierInstance(@play.cache.NamedCache(value=cmsCache)) to ProviderTarget(play.api.cache.NamedEhCacheProvider@77f743af)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1) while locating net.sf.ehcache.Ehcache annotated with @play.cache.NamedCache(value=cmsCache) at play.api.cache.EhCacheModule.play$api$cache$EhCacheModule$$bindCache$1(Cache.scala:179): Binding(interface play.api.cache.CacheApi qualified with QualifierInstance(@play.cache.NamedCache(value=cmsCache)) to ProviderTarget(play.api.cache.NamedCacheApiProvider@23f72489)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1) while locating play.api.cache.CacheApi annotated with @play.cache.NamedCache(value=cmsCache) at play.api.cache.EhCacheModule.play$api$cache$EhCacheModule$$bindCache$1(Cache.scala:180): Binding(interface play.cache.CacheApi qualified with QualifierInstance(@play.cache.NamedCache(value=cmsCache)) to ProviderTarget(play.api.cache.NamedJavaCacheApiProvider@100cf07)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
to fix this error, create first a FakeCacheApi Class for your tests like this:
public class FakeCacheApi implements CacheApi {
private HashMap<String, Object> data = new HashMap<>();
@Override
public <T> T get(String s) {
return (T) data.get(s);
}
@Override
public <T> T getOrElse(String s, Callable<T> callable, int i) {
return getOrElse(s, callable);
}
@Override
public <T> T getOrElse(String s, Callable<T> callable) {
if (data.containsKey(s)) {
return (T) data.get(s);
} else {
try {
T value = callable.call();
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
@Override
public void set(String s, Object o, int i) {
data.put(s, o);
}
@Override
public void set(String s, Object o) {
data.put(s, o);
}
@Override
public void remove(String s) {
data.remove(s);
}
}
and then override the bindings in your tests like this:
import play.cache.NamedCacheImpl;
....
Application application = new GuiceApplicationBuilder() .overrides(
bind(CacheApi.class).to(FakeCacheApi.class),
bind(CacheApi.class).qualifiedWith(new NamedCacheImpl("cmsCache")).to(FakeCacheApi.class) // repeat this line for every named cache you have
).build();