Код: Выделить всё
org.opentest4j.AssertionFailedError: expected: but was:
at com.hmhco.plugins.core.product.ProductBundleAltIdTypesTest.testGetProductAltKeyTypesCached(ProductBundleAltIdTypesTest.java:52)
Может ли эта проблема быть вызвана различиями в конфигурации кэширования между локальным и 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