Метод @Caching, вызванный из весеннего загрузочного теста [аннотированный @Transactional], не работает - PullRequest
0 голосов
/ 20 февраля 2019

Я использую кэширование redis и аннотации весенней загрузки [@Cacheable and @CahePut], я создал транзакцию RedisManager, которая будет использовать внешнюю транзакцию [callee of caching layer]

@Bean
public RedisCacheManager cacheManager() {
    RedisCacheManager rcm = 
    RedisCacheManager.builder(redisConnectionFactory())
            .cacheDefaults(cacheConfiguration())
            .transactionAware()
            .build();
    return rcm;
}

при тестировании какниже я использую встроенный redis -:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase
@Transactional
public class RoleServiceImplTest extends TestingProfile {

@Before
public void setup() throws Exception {
    //setup server and services

    redisServer = new RedisServer(redisPort);
    redisServer.start();
}
@Test
    public void getUsersForRoleForTemplateRole() {
    // call to caching layer methods directly annotated with @Cachable
}

... Оба раза [с @Transactional и без него] пружинные вызовы cache.put(key,result) без исключения, но они сохраняют значения только в случае без @Transactional.

Не могу найти много в интернете, спасибо любой помощи заранее.

1 Ответ

0 голосов
/ 20 февраля 2019

Короче говоря, просто поместите аннотацию @Commit или Rollback(false) над вашим классом или методом тестирования.

По умолчанию выполняется откат каждой транзакции после метода тестирования.

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-tx

В платформе TestContext транзакциями управляет TransactionalTestExecutionListener, который настраивается по умолчанию, даже если вы явно не объявляете @TestExecutionListeners в своем тестовом классе.Однако, чтобы включить поддержку транзакций, вы должны сконфигурировать bean-компонент PlatformTransactionManager в ApplicationContext, который загружен семантикой @ContextConfiguration (более подробная информация приведена ниже).Кроме того, вы должны объявить аннотацию Spring @Transactional на уровне класса или метода для своих тестов.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/transaction/TransactionalTestExecutionListener.html

Поведение декларативного отката и фиксации

По умолчанию тестовые транзакции будут автоматически откатываться после завершения теста;однако поведение фиксации транзакции и отката может быть настроено декларативно с помощью аннотаций @Commit и @Rollback на уровне класса и на уровне метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...