当前位置: 首页 > 知识库问答 >
问题:

用于Spring Boot的嵌入式Redis

石正卿
2023-03-14

我在机器上本地Redis服务器的帮助下,使用Spring Boot运行集成测试用例。

但我想要一个嵌入式Redis服务器,它不依赖于任何服务器,可以在任何环境下运行,比如H2内存数据库。我该怎么做?

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
@SpringApplicationConfiguration(classes = Application.class) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MasterIntegrationTest {

}

共有3个答案

佟阳飙
2023-03-14

另一种简洁的方法是使用test容器库,它可以在Docker容器中运行任何类型的应用程序,Redis也不例外。我最喜欢的是它与Spring Test生态系统轻轻耦合。

maven的依赖关系:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>${testcontainers.version}</version>
</dependency>

简单集成测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {"management.port=0"})
@ContextConfiguration(initializers = AbstractIntegrationTest.Initializer.class)
@DirtiesContext
public abstract class AbstractIntegrationTest {

    private static int REDIS_PORT = 6379;

    @ClassRule
    public static GenericContainer redis = new GenericContainer("redis:5-alpine").withExposedPorts(REDIS_PORT);

    public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext ctx) {
            // Spring Boot 1.5.x
            TestPropertySourceUtils.addInlinedPropertiesToEnvironment(ctx,
                "spring.redis.host=" + redis.getContainerIpAddress(),
                "spring.redis.port=" + redis.getMappedPort(REDIS_PORT));

            // Spring Boot 2.x.
            TestPropertyValues.of(
                "spring.redis.host:" + redis.getContainerIpAddress(),
                "spring.redis.port:" + redis.getMappedPort(REDIS_PORT))
                .applyTo(ctx);
        }
    }
}

自Spring Framework 5.2.5(Spring Boot 2.3.x)以来,您可以使用功能强大的DynamicPropertySource注释。以下是一个示例:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public abstract class AbstractIT {

    static GenericContainer redisContainer = new GenericContainer("redis:5-alpine").withExposedPorts(6379);

    @DynamicPropertySource
    static void properties(DynamicPropertyRegistry r) throws IOException {
        r.add("spring.redis.host", redisContainer::getContainerIpAddress);
        r.add("spring.redis.port", redisContainer::getFirstMappedPort);
    }
}
申阳伯
2023-03-14

您可以使用ozimov/intend-redis作为Maven(-test)-依赖项(这是kstyrc/intend-redis的继承者)。

>

<dependencies>
  ...
  <dependency>
    <groupId>it.ozimov</groupId>
    <artifactId>embedded-redis</artifactId>
    <version>0.7.1</version>
    <scope>test</scope>
  </dependency>

为集成测试调整应用程序属性

spring.redis.host=localhost
spring.redis.port=6379

在测试配置中使用嵌入式redis服务器

@TestConfiguration
public static class EmbededRedisTestConfiguration {

  private final redis.embedded.RedisServer redisServer;

  public EmbededRedisTestConfiguration(@Value("${spring.redis.port}") final int redisPort) throws IOException {
    this.redisServer = new redis.embedded.RedisServer(redisPort);
  }

  @PostConstruct
  public void startRedis() {
    this.redisServer.start();
  }

  @PreDestroy
  public void stopRedis() {
    this.redisServer.stop();
  }
}
汤博
2023-03-14

您可以使用嵌入式Redis,如https://github.com/kstyrc/embedded-redis

>

  • 将依赖项添加到pom。xml
  • 调整集成测试的属性以指向嵌入式redis,例如:

    spring:
      redis:
        host: localhost
        port: 6379
    

    在仅在测试中定义的组件中实例化嵌入式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();
        }
    }
    

  •  类似资料:
    • 我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?

    • 我在我的SpringBoot应用程序中使用下面提到的属性,在文件中让LDAP代码在我的本地机器上运行。 我想同时拥有我的嵌入式配置

    • 在学习教程的同时,我正在使用SPRING初始化器https://start.spring.io/使用springboot 2.0.2生成带有reactiveMongoDB的项目。 gradle文件列出:compile('org.springframework.boot:spring-boot-starter-data-mongodb-reactive') 我能够将该项目导入eclipse,主类使用

    • 问题内容: 使用标签将SVG直接包含在文档中时,您可以通过文档的样式表将CSS样式应用于SVG。但是,我试图将一种样式应用于嵌入的SVG(使用标签)。 是否可以使用以下代码? 问题答案: 简短的答案:不,因为样式不适用于文档边界。 但是,由于有标签,因此可以使用脚本将样式表插入svg文档。 这样的事情,并请注意,此代码假定已完全加载: 也可以插入一个元素来引用外部样式表: 另一个选择是使用第一种方

    • 我正在运行一个Spring web应用程序,但未能在最新的Eclipse中使用Tomcat7 Maven插件执行嵌入式tomcat,在windows上运行goal,但未能将其配置为运行Tomcat8.5,它一直查找Tomcat7文件夹。 tomcat7:run-war使用嵌入式Tomcat服务器将当前项目作为打包的web应用程序运行。 我找到了答案或这个答案,但它对部署tomcat很好。 这个项目

    • 我正在使用嵌入在我的Web应用程序(springboot)中的Camunda。我成功地创建了我的自定义身份提供程序(实现ReadOnlyIdtyProvider),并且正在从我的数据库中读取我的用户和组。 问题是,我认为Camunda会检查,例如,某个用户只有在他/她属于候选组时才能申请任务,但我不认为会发生这种情况。例如,我与a组的一个用户登录到驾驶舱,并能够申请分配给候选组B的任务。 所以我的