如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?

Posted

技术标签:

【中文标题】如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?【英文标题】:How can I run my integration tests locally on a Spring Boot application running on AWS? 【发布时间】:2018-03-15 19:54:44 【问题描述】:

我正在开发一个在 AWS 上运行的 Spring Boot 应用程序。我已经安装了 Spring Cloud AWS 启动器,但是当我尝试在我的笔记本电脑上本地运行集成测试时,我遇到了这个错误。

使用名称“org.springframework.cloud.aws.context.support.io.ResourceLoaderBeanPostProcessor#0”创建 bean 时出错:在设置构造函数参数时无法解析对 bean“amazonS3”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“amazonS3”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalStateException: 没有可用的 EC2 元数据,因为应用程序没有在 EC2 环境中运行。只有当应用程序在 EC2 实例上运行时,才能进行区域检测

有没有办法在没有 AWS 的情况下运行我的应用程序?仅用于本地集成测试。

【问题讨论】:

如果您在 AWS 环境之外运行应用程序。为避免该错误,请在 application.properties 文件中指定区域手册,如下所示cloud.aws.region.static=eu-west-1 这解决了我的问题。 【参考方案1】:

考虑添加使用外部 API 的类的虚假实现。 您只能在测试配置文件中使用它们。 例如:

@Component
@Profile("default")
public class FakePhotosUploader implements Photos 

  @Override
  public String uploadPhoto(byte[] bytes, String name, Integer receiptId) 
    return UUID.randomUUID().toString();
    //you can write here some implementation, suitable for your tests

  

您可以在默认配置文件中关闭 aws。

所以它不会转到 AWS。

只是不要将 AmazonS3 注入默认配置文件中的 bean,它就不会被创建。

希望我能正确理解您的问题。

【讨论】:

【参考方案2】:

您可以为测试配置文件创建一个配置类,其中不包括与 AWS 相关的 Spring 自动配置类。例如:

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import io.awspring.cloud.autoconfigure.context.ContextCredentialsAutoConfiguration;
import io.awspring.cloud.autoconfigure.context.ContextResourceLoaderAutoConfiguration;

@Configuration
@EnableAutoConfiguration(exclude= ContextCredentialsAutoConfiguration.class,ContextResourceLoaderAutoConfiguration.class)
@Profile("test")
public class AwsTestConfiguration 

    

【讨论】:

以上是关于如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS (EKS) 上运行 MySQL 集群支持、支持 HTTPS 的 Spring Boot 应用程序

如何在 Spring Boot WebFlux 上使用 AWS X-Ray 跟踪传入请求?

在 AWS Elastic BeanStalk 上运行的 Spring Boot 应用程序中配置 AWS RDS

使用 SSL / HTTPS 的 Spring Boot 项目无法在 AWS Elastic Beanstalk 上运行

AWS 可以与 Spring Boot 和 React 一起使用吗?

Amazon-Guard-Duty 用于我在 AWS 上运行的 Spring Boot 应用程序