我正在使用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上找不到很多东西,事前需要任何帮助。
答案 0 :(得分:0)
简而言之,只需在类或测试方法上放置@Commit
或Rollback(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
批注。
声明性回滚和提交行为
默认情况下,测试交易将在测试完成后自动回滚;但是,可以在类级别和方法级别通过
@Commit
和@Rollback
批注声明性地配置事务提交和回滚行为。