/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.cache; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.concurrent.TimeUnit; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheException; import net.sf.ehcache.Element; import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.builder.NotifyBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.BaseCacheTest; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.converter.IOConverter; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ReflectionHelper; import org.junit.Test; public class CacheProducerTest extends BaseCacheTest { private static final Poetry POETRY; private static final String FILEPATH_UPDATEDTEST_TXT = "src/test/resources/updatedtest.txt"; private static final String FILEPATH_TEST_TXT = "src/test/resources/test.txt"; @EndpointInject(uri = "mock:CacheProducerTest.result") protected MockEndpoint resultEndpoint; @EndpointInject(uri = "mock:CacheProducerTest.cacheException") protected MockEndpoint cacheExceptionEndpoint; static { POETRY = new Poetry(); POETRY.setPoet("Ralph Waldo Emerson"); POETRY.setPoem("Brahma"); } @Override public boolean isUseRouteBuilder() { return false; } private void sendFile(final String path) throws Exception { template.send("direct:a", new Processor() { public void process(Exchange exchange) throws Exception { // Set the property of the charset encoding exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8"); // Read in the file content using the exchange charset byte[] fileContent = context.getTypeConverter().mandatoryConvertTo(byte[].class, exchange, new File(path)); Message in = exchange.getIn(); in.setBody(fileContent); } }); } private void sendEmptyBody() { template.send("direct:a", new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody(null); } }); } private byte[] getFileAsByteArray(String path) throws Exception { // Read from an input stream InputStream is = IOHelper.buffered(new FileInputStream(path)); byte[] buffer = IOConverter.toBytes(is); is.close(); return buffer; } private void sendOriginalFile() throws Exception { sendFile(FILEPATH_TEST_TXT); } private void sendUpdatedFile() throws Exception { sendFile(FILEPATH_UPDATEDTEST_TXT); } private void sendSerializedData() throws Exception { template.send("direct:a", new Processor() { public void process(Exchange exchange) throws Exception { // Set the property of the charset encoding exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8"); Message in = exchange.getIn(); in.setBody(POETRY); } }); } @Test public void testAddingDataToCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); } @Test public void testAddingDataToCacheWithNonStringCacheKey() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant(10L)). to("cache://TestCache1"); } }); context.start(); NotifyBuilder notify = new NotifyBuilder(context).whenExactlyDone(1).create(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); notify.matches(10, TimeUnit.SECONDS); assertNotNull(fetchElement("10")); } @Test public void testAddingDataElementEternal() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setHeader(CacheConstants.CACHE_ELEMENT_EXPIRY_ETERNAL, constant(Boolean.TRUE)). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); Element element = fetchElement("Ralph_Waldo_Emerson"); assertTrue(element.isEternal()); } @Test public void testAddingDataElementIdle() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setHeader(CacheConstants.CACHE_ELEMENT_EXPIRY_IDLE, constant(24)). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); Element element = fetchElement("Ralph_Waldo_Emerson"); assertEquals(24, element.getTimeToIdle()); } @Test public void testAddingDataElementTimeToLive() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setHeader(CacheConstants.CACHE_ELEMENT_EXPIRY_TTL, constant(42)). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); Element element = fetchElement("Ralph_Waldo_Emerson"); assertEquals(42, element.getTimeToLive()); } private Element fetchElement(String key) { CacheEndpoint ep = context.getEndpoint("cache://TestCache1", CacheEndpoint.class); Cache cache = ep.getCacheManagerFactory().getInstance().getCache("TestCache1"); return cache.get(key); } @Test public void testAddingDataToCacheDoesFailOnEmptyBody() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(1); context.start(); log.debug("------------Beginning CacheProducer Add Does Fail On Empty Body Test---------------"); sendEmptyBody(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testAddingSerializableDataToCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Add Test---------------"); sendOriginalFile(); } @Test public void testUpdatingDataInCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_UPDATE)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Update Test---------------"); sendSerializedData(); } @Test public void testUpdatingDataInCacheDoesFailOnEmptyBody() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_UPDATE)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); cacheExceptionEndpoint.expectedMessageCount(1); context.start(); log.debug("------------Beginning CacheProducer Update Does Fail On Empty Body Test---------------"); sendEmptyBody(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testDeletingDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETE)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Delete Test---------------"); sendUpdatedFile(); } @Test public void testDeletingDataFromCacheDoesNotFailOnEmptyBody() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETE)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"); } }); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Delete Does Not Fail On Empty Body Test---------------"); sendEmptyBody(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testDeletingAllDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETEALL)). to("cache://TestCache1"); } }); context.start(); log.debug("------------Beginning CacheProducer Delete All Elements Test---------------"); sendUpdatedFile(); } @Test public void testDeletingAllDataFromCacheDoesNotFailOnEmptyBody() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETEALL)). to("cache://TestCache1"); } }); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Delete All Elements Does Not Fail On Empty Body Test---------------"); sendEmptyBody(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testUnknownOperation() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant("UNKNOWN")). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). to("mock:CacheProducerTest.result"); } }); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(1); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendUpdatedFile(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testUnknownOperationDoesNotFailOnEmptyBody() throws Exception { final RouteBuilder builder = new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). choice().when(exceptionMessage().isEqualTo(CacheConstants.CACHE_OPERATION + " UNKNOWN is not supported.")). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException").end(); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant("UNKNOWN")). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). to("mock:CacheProducerTest.result"); } }; context.setTracing(true); context.addRoutes(builder); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(1); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Does Fail On Empty Body Test---------------"); sendEmptyBody(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringNonExistingDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETEALL)). to("cache://TestCache1"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendUpdatedFile(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringNonExistingDataFromCacheDoesNotFailOnEmptyBody() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_DELETEALL)). to("cache://TestCache1"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Does Not Fail On Empty Body Test---------------"); sendEmptyBody(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). setBody(constant("Don't care. This body will be overridden.")). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); String body = new String(getFileAsByteArray(FILEPATH_UPDATEDTEST_TXT), "UTF-8"); resultEndpoint.expectedBodiesReceived(body); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendUpdatedFile(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringDataFromCacheUsingUrlParameters() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). to("cache://TestCache1?operation=add&key=foo"). setBody(constant("Don't care. This body will be overridden.")). to("cache://TestCache1?operation=get&key=foo"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); resultEndpoint.expectedBodiesReceived(POETRY); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendSerializedData(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringDataFromCacheUsingUrlParametersMixed() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). to("cache://TestCache1?key=foo"). setBody(constant("Don't care. This body will be overridden.")). setHeader(CacheConstants.CACHE_KEY, constant("foo")). to("cache://TestCache1?operation=get"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); resultEndpoint.expectedBodiesReceived(POETRY); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendSerializedData(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testQueringDataFromCacheUsingUrlParametersOverrided() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("foo")). to("cache://TestCache1?operation=get&key=bar"). setBody(constant("Don't care. This body will be overridden.")). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET)). setHeader(CacheConstants.CACHE_KEY, constant("foo")). to("cache://TestCache1?operation=delete&key=Piotr_Klimczak"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); resultEndpoint.expectedBodiesReceived(POETRY); context.start(); log.debug("------------Beginning CacheProducer Query An Elements Test---------------"); sendSerializedData(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testCheckDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setBody(constant("Test body")). to("cache://TestCache1"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_URL_CHECK)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); resultEndpoint.expectedBodiesReceived("Test body"); context.start(); log.debug("------------Beginning CacheProducer Check An Element Exists Test---------------"); sendOriginalFile(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testCheckDataFromCacheNegativeTest() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setBody(constant("Test body")). to("cache://TestCache1"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_URL_CHECK)). setHeader(CacheConstants.CACHE_KEY, constant("foo")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNotNull()). to("mock:CacheProducerTest.result").end(); } }); resultEndpoint.expectedMessageCount(0); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Check An Element Does Not Exist Test---------------"); sendOriginalFile(); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } @Test public void testCheckExpiredDataFromCache() throws Exception { context.addRoutes(new RouteBuilder() { public void configure() { onException(CacheException.class). handled(true). to("log:LOGGER"). to("mock:CacheProducerTest.cacheException"); from("direct:a"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). setBody(constant("Test body")). to("cache://TestCache1?timeToLiveSeconds=1"); from("direct:b"). setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_URL_CHECK)). setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). to("cache://TestCache1"). choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()). to("mock:CacheProducerTest.result").end(); } }); // Put an element to the cache resultEndpoint.expectedMessageCount(1); cacheExceptionEndpoint.expectedMessageCount(0); context.start(); log.debug("------------Beginning CacheProducer Check An Element Does Not Exist After Expiry Test---------------"); sendOriginalFile(); // simulate the cache element to appear as "expired" (without having to wait for it to happen) // however as there's no public API to do so we're forced to make use of the reflection API here Cache testCache = cache.getCacheManagerFactory().getInstance().getCache("TestCache1"); Element element = testCache.getQuiet("Ralph_Waldo_Emerson"); ReflectionHelper.setField(Element.class.getDeclaredField("creationTime"), element, System.currentTimeMillis() - 10000); testCache.putQuiet(element); // Check that the element is not found when expired template.sendBody("direct:b", "dummy"); resultEndpoint.assertIsSatisfied(); cacheExceptionEndpoint.assertIsSatisfied(); } }