嵌入式Redis服务器无法启动

时间:2020-06-24 06:07:57

标签: java spring spring-boot kotlin redis

我有一个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()
    }
}

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,从我收集到的信息来看,如果您使用的是 maven 的 surefire 插件,那么测试将并行运行以提高速度和效率,并且服务器正尝试在同一端口上启动多个实例。

就我而言,我正在测试从 Spring Boot 应用程序上的不同配置文件加载的不同属性,因此我只需要更改每个配置文件各自属性文件中的端口。如果您有类似的情况,那么这可能对您有用。

如果这不是您的情况,您可以考虑几个想法。

  1. 你可以将端口设置为一个有界范围内的随机数来启动redis服务器,这样你的服务器启动就不会发生端口冲突。在我看来,如果您正在运行大量测试,则此选项将无法扩展,并且无法保证即使在有界范围内使用随机数也不会遇到冲突,尽管发生碰撞的可能性会降低发生这种情况。

  2. 根据您的单元测试技术(JUnit、TestNG),您可以尝试将 redis 服务器作为套件的一部分启动,然后将其连接到启动/停止。