我有一个Springboot项目,作为测试的一部分,我使用了嵌入式Redis服务器。当我使用Intellij运行特定的测试类时,它可以正常工作并通过测试。但是当我使用mvn clean test
命令运行测试时,收到以下错误:
BeanCreationException:创建名称为bean的错误 'core.config.TestRedisConfiguration':初始化方法的调用 失败嵌套异常为java.lang.RuntimeException:无法启动 Redis服务器。查看日志以获取详细信息。
这是我pom.xml文件中的依赖项:
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
<scope>test</scope>
</dependency>
这是我的TestRedisConfiguration类:
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.test.context.TestConfiguration
import redis.embedded.RedisServer
import redis.embedded.RedisServerBuilder
import javax.annotation.PostConstruct
import javax.annotation.PreDestroy
@TestConfiguration
class TestRedisConfiguration(@Value("\${redis.port:63799}") private val port: Int) {
private val redisServer: RedisServer
init {
redisServer = RedisServerBuilder().port(port).build()
}
@PostConstruct
fun postConstruct() {
redisServer.start()
}
@PreDestroy
fun preDestroy() {
redisServer.stop()
}
}
答案 0 :(得分:0)
我遇到了类似的问题,从我收集到的信息来看,如果您使用的是 maven 的 surefire 插件,那么测试将并行运行以提高速度和效率,并且服务器正尝试在同一端口上启动多个实例。
就我而言,我正在测试从 Spring Boot 应用程序上的不同配置文件加载的不同属性,因此我只需要更改每个配置文件各自属性文件中的端口。如果您有类似的情况,那么这可能对您有用。
如果这不是您的情况,您可以考虑几个想法。
你可以将端口设置为一个有界范围内的随机数来启动redis服务器,这样你的服务器启动就不会发生端口冲突。在我看来,如果您正在运行大量测试,则此选项将无法扩展,并且无法保证即使在有界范围内使用随机数也不会遇到冲突,尽管发生碰撞的可能性会降低发生这种情况。
根据您的单元测试技术(JUnit、TestNG),您可以尝试将 redis 服务器作为套件的一部分启动,然后将其连接到启动/停止。