![](/img/trans.png)
[英]Spring boot with @RefreshScope @PostConstruct @PreDestroy
[英]Spring issue with @PostConstruct and @PreDestroy
我有一个 Spring 应用程序,我正在尝试使用 EmbededRedis 进行测试。 所以我创建了一个像下面这样的组件来初始化并在测试后杀死 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 被调用,并且 EmbededRedis 试图一次又一次地启动正在运行的 redis 服务器,这是执行过程中的问题。
有没有办法以任何方式处理这种情况?
更新这就是我主要定义我的测试的方式。
@SpringBootTest(classes = {SpringApplication.class})
@ActiveProfiles("test")
public class RedisApplicationTest {
抛弃 class 并编写一个@Configuration
class 将RedisServer
暴露为一个 bean。
@Configuration
public void EmbeddedRedisConfiguration {
@Bean(initMethod="start", destroyMethod="stop")
public RedisServer embeddedRedisServer(@Value("${spring.redis.port}") int port) {
return new RedisServer(port);
}
}
所以我按照@M 的建议调试了 ContextInitialization。 迪南。
对我来说,问题是,我们的应用程序是 mocking 不同的类,以便将 mocking 与 Spring 上下文混合。 现在,当您使用模拟时, MockitoContextInitializer
也会成为您缓存键的一部分,这会导致缓存未命中。 原因是,对于不同的测试类,mock 下的类明显不同。
看情况,我更喜欢 go 在测试完成后使用@DirtiesContext
使比赛无效,以便稍后我可以重新初始化上下文以进行不同的测试。
注意@DirtiesContext
建议避免使用,因为它会减慢测试速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.