我有一个spring应用程序,我正试图用embedderedis测试它。所以我创建了一个如下的组件,在测试之后初始化并杀死redis。
@Component
public class EmbededRedis {
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(redisPort);
redisServer.start();
}
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
}
但现在我面临一个奇怪的问题。因为spring缓存了上下文,所以predestroy并不是每次在我的测试执行后都会被调用,但是由于某种原因,@postconstruct会被调用,embedderedis会一次又一次地尝试启动正在运行的redis服务器,这就是执行中的creatimg问题。
有没有办法处理这种情况?
更新这是我主要如何定义我的测试。
@SpringBootTest(classes = {SpringApplication.class})
@ActiveProfiles("test")
public class RedisApplicationTest {
2条答案
按热度按时间oogrdqng1#
别上课了,写一篇文章
@Configuration
暴露的类别RedisServer
像豆子一样。ztmd8pv52#
所以我按照@m的建议调试了contextinitialization。迪纳姆。
对我来说,问题是,我们的应用程序模拟不同的类,以便将模拟与spring上下文混合。现在,当你使用mock时,
MockitoContextInitializer
也会成为缓存密钥的一部分,从而导致缓存未命中。原因是,对于不同的测试类,mock下的类明显不同。从目前的情况来看,我更愿意继续
@DirtiesContext
在测试完成后使竞赛无效,以便稍后可以为不同的测试重新初始化上下文。笔记
@DirtiesContext
在某种程度上建议避免,因为它会减慢测试速度。