Модульный тест для метода, извлекающего данные из CacheManger с помощью цикла for - PullRequest
0 голосов
/ 13 октября 2018

У меня есть метод, который позволяет извлекать людей из следующего веб-интерфейса и сохранять их в кеше, и я хочу получить те же кэшированные данные из диспетчера кэша.У меня трудности с написанием модульного теста для этого метода.Любая помощь высоко ценится

import javax.cache.Cache;
import javax.cache.CacheManager;

@Autowired
@Qualifier(value = "cacheManager")
private CacheManager cacheManager;

*public List<Person> fallbackPersons() {
      List<Person> data = new ArrayList<>();
    for (Cache.Entry<Object, Object> entry :cacheManager.getCache("person"){ 
        data = (List<Person>) entry.getValue();
        }
    return data;
}*

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Вы можете смоделировать CacheManager, заглушить его и проверить результат, как показано ниже:

    @RunWith(MockitoJUnitRunner.class)
    public class PersonsServiceTest {

        @Mock
        private CacheManager cacheManager;

        @InjectMocks
        PersonsService service = new PersonsService();

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

        @Test
        public void fallbackPersonsWithNonEmptyCache() {
            List<Person> persons = Collections.singletonList(new Person());  // create person object as your Person class definition
            // mock cache entry
            Cache.Entry <Object, Object> entry = Mockito.mock(Cache.Entry.class);

            // do stubbing
            Mockito.when(entry.getValue()).thenReturn(persons);
            Mockito.when(cacheManager.getCache(Matchers.anyString()))
                    .thenReturn(entry);

            // execute
            List<Person> persons = service.fallbackPersons();

            // verify
            Assert.assertNotNull(persons);
            Assert.assertFalse(persons.isEmpty());
        }
    }
0 голосов
/ 15 октября 2018

Правильное решение моей проблемы.

@ActiveProfiles("test")
@RunWith(MockitoJUnitRunner.class)
@Slf4j
public class CacheTest {

    @Spy
    @InjectMocks
    PersonService personService;

    @Mock
    private CacheManager cacheManager;

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

    @Test
    public void fallbackMCCsWithNonEmptyCache() {

        List<Person> persons = Collections.singletonList(new Person());

        Iterator<Cache.Entry <Object, Object>> cacheIterator = 
        Mockito.mock(Iterator.class);
        Cache <Object, Object> cache = Mockito.mock(Cache.class);
        Cache.Entry <Object, Object> entry = Mockito.mock(Cache.Entry.class);
        Mockito.when(cacheManager.getCache(Mockito.anyString()))
        .thenReturn(cache);
        Mockito.when(cache.iterator()).thenReturn(cacheIterator);
        List<Person> personList = personService.fallbackPersons();
        Assert.assertNotNull(personList);
        Assert.assertTrue(personList.isEmpty());
    }
}
0 голосов
/ 13 октября 2018

1.Модульное тестирование

Если вы намереваетесь провести модульное тестирование открытого метода fallbackPersons с помощью насмешки CacheManager, я настоятельно рекомендую изменить стиль, которым вы вводите компонент cacheManager, с помощью инжектора конструктора:

import javax.cache.Cache;
import javax.cache.CacheManager;

@Service    
public class PersonsService {
    private final CacheManager cacheManager;

    @Autowired
    public PersonsService(@Qualifier(value = "cacheManager") CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    public List<Person> fallbackPersons() {
        List<Person> data = new ArrayList<>();
        for (Cache.Entry<Object, Object> entry : cacheManager.getCache("person")) { 
            data = (List<Person>) entry.getValue();
        }

        return data;
    }
}

Этот класс теперь очень прост для модульного тестирования, внедрив макет CacheManager и запрограммировав его поведение, вам не нужно загружать контекст Spring (для применения @Autowired) или использовать библиотеку Powermock дляполучить доступ к частным свойствам.

Пример модульного теста:

public class PersonsServiceTest {
    @Test
    public void fallbackPersonsWithEmptyCache() {
        CacheManager cacheManager = Mockito.mock(CacheManager.class);
        Mockito.when(cacheManager.getCache(Matchers.anyString()))
            .thenReturn(Collections.emptyList());

        PersonsService service = new PersonsService(cacheManager);
        List<Person> persons = service.fallbackPersons();
        Assert.assertNotNull(persons);
        Assert.assertTrue(persons.isEmpty());
    }
}

2.Интеграционное тестирование

Если вы действительно хотите протестировать свой сервис с использованием реальной реализации диспетчера кэширования из Spring, то вам следует рассмотреть пример использования классов AbstractJUnit4SpringContextTests или AbstractTestNGSpringContextTests, предоставляемых Spring Framework.,Они позволят вам инициализировать истинный контекст Spring и внедрить реальные реализации CacheManager, такие как EhCahce и т. Д.

...