Spring Cloud 应用程序与 AWS Parameter Store 的集成测试

Posted

技术标签:

【中文标题】Spring Cloud 应用程序与 AWS Parameter Store 的集成测试【英文标题】:Integration testing of a Spring Cloud application with the AWS Parameter Store 【发布时间】:2020-07-09 22:12:44 【问题描述】:

如何对从 AWS Parameter Store 读取属性的 Spring Boot 应用程序执行集成测试(依赖项org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config)。

是否应在集成测试中禁用 AWS Parameter Store 集成?

如何在集成测试中使用本地服务器(或模拟)而不是真正的 AWS Parameter Store?

【问题讨论】:

【参考方案1】:

为了简单性和性能,通常应在集成测试中禁用与 AWS Parameter Store 的集成。相反,从文件加载测试属性(例如,src/test/resources/test.properties

@SpringBootTest(properties = "aws.paramstore.enabled=false")
@TestPropertySource("classpath:/test.properties")
public class SampleTests 
  //...

如果个别测试需要检查与 AWS Parameter Store 的集成,请使用 Testcontainers 和 LocalStack 用于 Docker 的易于使用的本地 AWS 云堆栈。

添加一个配置类,创建 AWSSimpleSystemsManagement 类型的自定义 ssmClient bean,配置为使用 LocalStack,而不是使用真正的 AWS 参数存储在 org.springframework.cloud.aws.autoconfigure.paramstore.AwsParamStoreBootstrapConfiguration 中声明的默认值。

@Configuration(proxyBeanMethods = false)
public class AwsParamStoreBootstrapConfiguration 

  public static final LocalStackContainer AWS_SSM_CONTAINER = initContainer();

  public static LocalStackContainer initContainer() 
    LocalStackContainer container = new LocalStackContainer().withServices(SSM);
    container.start();
    Runtime.getRuntime().addShutdownHook(new Thread(container::stop));
    return container;
  

  @Bean
  public AWSSimpleSystemsManagement ssmClient() 
    return AWSSimpleSystemsManagementClientBuilder.standard()
        .withEndpointConfiguration(AWS_SSM_CONTAINER.getEndpointConfiguration(SSM))
        .withCredentials(AWS_SSM_CONTAINER.getDefaultCredentialsProvider())
        .build();
  

至于AwsParamStorePropertySourceLocator 是由Spring Cloud“引导”上下文加载的,您需要通过将以下条目添加到文件src/test/resources/META-INF/spring.factories 来将配置类添加到引导上下文中

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.test.AwsParamStoreBootstrapConfiguration

同样的方法可用于使用 Mockito 模拟 ssmClient

【讨论】:

以上是关于Spring Cloud 应用程序与 AWS Parameter Store 的集成测试的主要内容,如果未能解决你的问题,请参考以下文章

带有 AWS 参数存储的 Spring Cloud

将 Spring boot/cloud 与 Amazon AWS lambda 一起使用不会注入值

如何在本地使用 spring-cloud-starter-aws 运行应用程序?

Spring Boot 无法从 Spring Cloud AWS Core 依赖项启动

带有 Spring-cloud-aws 和 cloudwatch 指标的 Spring Boot

AWS 实例配置文件不适用于 Spring Cloud AWS