从Spring Boot测试调用的@Caching方法[注有@Transactional]无法正常工作

时间:2019-02-20 16:24:40

标签: java spring spring-boot caching redis

我正在使用Redis缓存和Spring Boot批注[@Cacheable和@CahePut], 我制作了RedisManager transactionAware,它将使用外部事务[缓存层的被调用者]

@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的情况下才持久保存值。

在Internet上找不到很多东西,事前需要任何帮助。

1 个答案:

答案 0 :(得分:0)

简而言之,只需在类或测试方法上放置@CommitRollback(false)批注即可。

默认情况下,Spring在测试方法之后回滚每个事务。

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

  

在TestContext框架中,事务由TransactionalTestExecutionListener管理,该事务默认配置,即使您没有在测试类上显式声明@TestExecutionListeners也不例外。但是,要启用对事务的支持,必须在PlatformTransactionManager中配置一个ApplicationContext语义的@ContextConfiguration bean(稍后将提供更多详细信息)。此外,您必须在测试的类或方法级别声明Spring的@Transactional批注。

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

  

声明性回滚和提交行为

     

默认情况下,测试交易将在测试完成后自动回滚;但是,可以在类级别和方法级别通过@Commit@Rollback批注声明性地配置事务提交和回滚行为。