Тест Spring Boot: метод @Cacheable не кэшируется должным образом с помощью @Transactional и Caffeine после обновления доJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Тест Spring Boot: метод @Cacheable не кэшируется должным образом с помощью @Transactional и Caffeine после обновления до

Сообщение Anonymous »

Я тестирую метод Spring Boot, использующий кэширование с аннотацией @Cacheable. Метод предназначен для возврата всех различных типов альтернативных ключей из базы данных. Тест проходит успешно при локальном запуске, но завершается неудачей в Concourse CI/CD со следующей ошибкой:

Код: Выделить всё

org.opentest4j.AssertionFailedError: expected:  but was: 
at com.hmhco.plugins.core.product.ProductBundleAltIdTypesTest.testGetProductAltKeyTypesCached(ProductBundleAltIdTypesTest.java:52)

Похоже, что кэширование не работает, когда тест выполняется в среде CI/CD. Вместо ожидаемого поведения (возврата кэшированных значений после первого вызова базы данных) тест записывает 0 попаданий в кэш. Локально метод productBundleService.getAllDistinctAltKeyTypesFromProductBundleAltId() корректно возвращает кэшированные значения, а база данных запрашивается только один раз.
Может ли эта проблема быть вызвана различиями в конфигурации кэширования между локальным и CI/CD среды? Или есть проблема с тем, как @Cacheable взаимодействует с платформой тестирования в конвейере CI/CD?
Я пытаюсь протестировать функцию кэширования в моем ProductBundleService с помощью метода testGetProductAltKeyTypesCached. Тест проходит локально, но не проходит в среде CI/CD (Зал).
** Это мой код: **

Код: Выделить всё

package com.hmhco.plugins.core.product;

import com.hmhco.BaseIntegrationTest;
import com.hmhco.plugins.core.product.model.ProductBundleAltId;
import com.hmhco.plugins.core.product.repo.ProductBundleAltIdRepository;
import com.hmhco.plugins.core.product.service.ProductBundleService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;

import java.util.List;

import static com.hmhco.plugins.utils.GeneralConstants.DBID;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

@SpringBootTest(properties = {
"spring.cache.type=caffeine",
"spring.cache.jcache.provider=org.ehcache.jsr107.EhcacheCachingProvider",
"spring.cache.cache-names=product-bundle-alt-key-types\n",
"spring.cache.caffeine.spec=maximumSize=1000,expireAfterAccess=10s",
"spring.profiles.active=test"})
class ProductBundleAltIdTypesTest extends BaseIntegrationTest {
@Autowired
ProductBundleService productBundleService;
@SpyBean
ProductBundleAltIdRepository productBundleAltIdRepository;

@BeforeEach
public void setUp() {
productBundleAltIdRepository.save(ProductBundleAltId.builder().altKeyType(DBID).altKey("12").build());
}

@AfterEach
public void tearDown() {
productBundleAltIdRepository.deleteAll();
}

@Test
void testGetProductAltKeyTypesCached() {
int counter = 0;
for (int i = 0; i < 3; i++) {
if (productBundleService.getAllDistinctAltKeyTypesFromProductBundleAltId().equals(List.of(DBID)))
counter++;
}
Assertions.assertEquals(3, counter);
verify(productBundleAltIdRepository, times(1)).getAllDistinctAltKeyIds();
}
}

Код: Выделить всё

 @Cacheable(value = "product-bundle-alt-key-types")
@Transactional(readOnly = true)
public List getAllDistinctAltKeyTypesFromProductBundleAltId() {
return productBundleAltIdRepository.getAllDistinctAltKeyIds();
}

Код: Выделить всё

  @Query("SELECT DISTINCT altKeyType FROM ProductBundleAltId")
List getAllDistinctAltKeyIds();
Дополнительная информация
Существует похожий тестовый класс, который работает
У меня есть другой тестовый класс с почти идентичной структурой, тестирующий то же самое логика кэширования, но с другим объектом. Этот тест проходит как локально, так и в зале без каких-либо проблем. Основное различие заключается в используемом объекте, но конфигурация кэширования, методы репозитория и тестовые утверждения по существу одинаковы.
Проблема началась после обновления Spring BootЭта проблема начала возникать после того, как я обновил Spring Boot до версии 3.3.6 для устранения уязвимостей, о которых сообщил Snyk. В рамках обновления мне пришлось внести следующие изменения в проект: Обновлены различные зависимости для совместимости с Spring Boot 3.3.6.
Вот что я пытался решить проблема:
Измененная конфигурация кэша
Я экспериментировал с изменением конфигурации кэша в аннотации @SpringBootTest, в частности, свойства Spring.cache.caffeine.spec. Я уменьшил время истечения срока действия до expireAfterAccess=10 с и снова увеличил его до 3600 с, чтобы посмотреть, повлияет ли это на поведение теста. Однако это не решило проблему.
Использовалась аннотация @DirtiesContext.
Я добавил аннотацию @DirtiesContext в тестовый класс, чтобы обеспечить перезагрузку контекста приложения до и после теста. . К сожалению, это также не повлияло на решение проблемы сбоя теста.
Несмотря на эти изменения, тест продолжает проходить локально, но не проходит в Concourse.

Подробнее здесь: https://stackoverflow.com/questions/793 ... nsactional
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»