junit @SpringBootTest для org.springframework.cache.Cache - PullRequest
0 голосов
/ 08 января 2020

У меня уже есть весенний ehcache в приложении весенней загрузки. 1 API реализован для удаления кеша. И я пишу джунты для этого.

Вот код конфигурации cacheManager в моей Конфигурации. java

 @Bean
    public CacheManager cacheManager()
    {
            EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
            factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            factoryBean.setShared(true);
            return new EhCacheCacheManager(factoryBean.getObject());
    }

В моем тестовом классе я не могу издеваться над CacheManager, поскольку не умеет читать ehcache. xml.

Вот мой класс testClass:

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.util.ReflectionTestUtils;



@SpringBootTest
@RunWith(SpringRunner.class)
public class DriverServiceTest
{

    @InjectMocks
    private DriverServiceImpl driverServiceImpl = null;

    @Mock
    private DriverMongoRepository mongoRepository;

    @Autowired
    private CacheManager ehCacheManager;

    @TestConfiguration
    public static class TestConfig
    {
        @Bean
        public CacheManager cacheManager()
        {
            EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
            factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            factoryBean.setShared(true);
            return new EhCacheCacheManager(factoryBean.getObject());
        }
    }

    @Before
    public void setUp()
    {
        MockitoAnnotations.initMocks(this);

    }

    @Test
    public void testEvictCache() throws Exception
    {
      //Trying to mock ehCacheManager similar to cacheManager() of configuration.java

        String response = driverServiceImpl.evictCache("dummyUser", "getDriver", "1");
    }
}

Поскольку мой ehCacheManager неправильно смоделирован, я получаю нулевой указатель на Cache cache = ehCacheManager.getCache ("getDriver");

Может кто-нибудь помочь мне смоделировать CacheManager, аналогичный cacheManager () конфигурации. java

Надеюсь, мой вопрос понятен !! Заранее спасибо

1 Ответ

0 голосов
/ 05 марта 2020

Итак, вот пример кода того, как я достиг кэширования для ehcache, предоставляемого Spring Framework.

 @SpringBootTest
public class DriverServiceTest
{

    @InjectMocks
    private DriverServiceImpl driverServiceImpl  = null;

    @Mock
    private CacheManager mockCacheManager;

    private static CacheManager cacheManager;

    @BeforeClass
    public static void initialClassSetUp()
    {
        @SuppressWarnings("resource")
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        cacheManager = context.getBean("cacheManager", org.springframework.cache.ehcache.EhCacheCacheManager.class);
    }

    @Before
    public void setUp()
    {
        MockitoAnnotations.initMocks(this);
    }

    @Configuration
    @EnableCaching
    static class SpringConfig
    {
        @Bean
        public CacheManager cacheManager()
        {
            EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
            factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            factoryBean.setShared(true);
            EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
            ehCacheCacheManager.setCacheManager(factoryBean.getObject());
            return ehCacheCacheManager;
        }
    }

   @Test
    public void testEvictCacheKeyNotExist() throws Exception
    {
        Cache cache = cacheManager.getCache("getSubaccounts");
        ReflectionTestUtils.setField(driverServiceImpl , "ehCacheManager", cacheManager);
        when(mockCacheManager.getCache(Mockito.anyString()))
                .thenReturn(cache);
        String actualValue = driverServiceImpl.evictCache("dummyUserName", "getSubaccounts",
                "dummyKeyName");
        assertTrue(actualValue.equals("key not exists"));
    }

Вот несколько моментов, на которые следует обратить внимание:

  1. Необходимо добавить аннотацию @EnableCaching вместе с @Configuration в классе config stati c.

  2. Значение cacheManager должно быть назначено локальному cacheManager в initialClassSetUp (), так как оно должно выполняется один раз для каждого класса.

  3. Теперь тот же cacheManager можно установить в качестве значения для частного кэширующего менеджера поля класса обслуживания с помощью
    ReflectionTestUtils.setField (driverServiceImpl, "ehCacheManager" , cacheManager);

и тада !! теперь вы можете отстаивать свои дела !!

...