2016-12-27 5 views
-1

Я создал простое приложение кэширования, как показано ниже:тест JUnit с EhCache3

import org.ehcache.*; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

import javax.cache.CacheException; 
import java.util.Map; 
import java.util.concurrent.TimeUnit; 

public class JsonObjectCacheManager { 
    private static final Logger logger = LoggerFactory.getLogger(JsonObjectCacheManager.class); 
    private final Cache<String, JsonObjectWrapper> objectCache; 

    //setting up cache 
    public JsonObjectCacheManager() { 
     CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() 
       .withCache("jsonCache", 
         CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, JsonObjectWrapper.class, 
           ResourcePoolsBuilder.newResourcePoolsBuilder() 
             .heap(100, EntryUnit.ENTRIES) 
             .offheap(10, MemoryUnit.MB)) 
           .withExpiry(Expirations.timeToLiveExpiration(Duration.of(5, TimeUnit.MINUTES))) 
           .withValueSerializingCopier() 
           .build()) 
       .build(true); 

     objectCache = cacheManager.getCache("jsonCache", String.class, JsonObjectWrapper.class); 
    } 

    public void putInCache(String key, Object value) { 
     try { 
      JsonObjectWrapper objectWrapper = new JsonObjectWrapper(value); 
      objectCache.put(key, objectWrapper); 
     } catch (CacheException e) { 
      logger.error(String.format("Problem occurred while putting data into cache: %s", e.getMessage())); 
     } 
    } 

    public Object retrieveFromCache(String key) { 
     try { 
      JsonObjectWrapper objectWrapper = objectCache.get(key); 
      if (objectWrapper != null) 
       return objectWrapper.getJsonObject(); 
     } catch (CacheException ce) { 
      logger.error(String.format("Problem occurred while trying to retrieveSpecific from cache: %s", ce.getMessage())); 
     } 
     logger.error(String.format("No data found in cache.")); 
     return null; 
    } 

    public boolean isKeyPresent(String key){ 
     return objectCache.containsKey(key); 
    } 

} 

JsonObjectWrapper просто класс обертку, чтобы обернуть объект таким образом, чтобы можно сериализовать.

@Getter 
@Setter 
@ToString 
@AllArgsConstructor 
public class JsonObjectWrapper implements Serializable { 
    private static final long serialVersionUID = 3588889322413409158L; 
    private Object jsonObject; 
} 

Я написал тест JUnit, как показано ниже:

import org.junit.*; 
import org.mockito.*; 

import java.util.*; 

import static org.junit.Assert.*; 

@RunWith(MockitoJUnitRunner.class) 
public class JsonObjectCacheManagerTest { 

    private JsonObjectCacheManager cacheManager; 

    private Map<String, Object> names; 

    @Before 
    public void setup(){ 
     /*names = new HashMap(){ 
      { 
        put("name1", "Spirit Air Lines"); 
        put("name2", "American Airlines"); 
        put("name3", "United Airlines"); 
       } 
      };*/ 

     //edited as per Henri's point and worked 
     names = new HashMap(); 
     names.put("name1", "Spirit Air Lines"); 
     names.put("name2", "American Airlines"); 
     names.put("name3", "United Airlines"); 
      cacheManager = new JsonObjectCacheManager(); 
     } 
    @Test 
    public void isPresentReturnsTrueIfObjectsPutInCache() throws Exception { 
     //put in cache 
     cacheManager.putInCache("names",names); 
     assertTrue(cacheManager.isKeyPresent("names")); 
    } 

    @Test 
    public void cacheTest() throws Exception { 
     //put in cache 
     cacheManager.putInCache("names",names); 

     //retrieve from cache 
     Map<String, Object> namesFromCache = (Map<String, Object>) cacheManager.retrieveFromCache("names"); 
     //validate against the cached object 
//  assertEquals(3, namesFromCache.size()); 
//  assertEquals("American Airlines", namesFromCache.get("name2")); 

    } 
} 

Я получаю ошибку утверждение говоря ключа нет в кэше. Это означает, что объект не добавляется в кеш.

Есть ли способ сделать junit тест для этого? Спасибо за помощь.

Редактировать: Эй, ребята, @Henri указал на мою ошибку, и она решила мою проблему. :)

+0

Каков ваш класс 'JsonObjectWrapper' и что делает его метод' getJsonObject'? Его название предполагает, что это, вероятно, не тот метод, который вы хотите вызвать в 'retrieveFromCache' - вы хотите, чтобы исходный (не JSON) объект там, если вы хотите, чтобы этот тест прошел. –

+0

@DavidWallace Я хочу предотвратить мутацию кэшированного объекта, поэтому кэшируемый объект должен реализовывать интерфейс Serializable, документ здесь по адресу http://www.ehcache.org/documentation/3.0/serializers-copiers.html. getJsonObject() - это просто метод getter -> посмотрите, как я использую плагины Lombok для генерации getters/seters/cons. Он называется просто для распаковки объекта json, кэшированного. –

ответ

2

Проблема заключается в вашей HashMap. То, как вы создаете экземпляр, создает анонимный внутренний класс. Который содержит ссылку на экземпляр внешнего класса. Какой класс тестирования. И тестовый класс не сериализуем.

Если вы используете следующий код, все тесты проходят красиво.

names = new HashMap(); 
    names.put("name1", "Spirit Air Lines"); 
    names.put("name2", "American Airlines"); 
    names.put("name3", "United Airlines"); 
+0

спасибо, что указали это. Я это была действительно глупая ошибка, которую я сделал. И это решило мою проблему. Еще раз спасибо. –

0
@Test 
public void cacheTest() throws Exception { 
    cacheManager = Mockito.mock(JsonObjectCacheManager.class); 

Вы должны не фиктивный класс под испытанием.

+0

мой плохой ,,, я забыл удалить этот ... даже если я удалю его, тест провалится. Моя забота заключается в том, является ли это способом проверки кеширования или я чего-то не хватает ... но спасибо за ур время :) –

+0

@Timonthy Truckle, я забыл упомянуть вас в комментарии –