【发布时间】:2017-11-30 14:34:01
【问题描述】:
我正在尝试设置一项服务,该服务根据存储桶、密钥和区域从 AWS KMS(亚马逊的密钥管理服务)中提取加密值。
这样做不是我遇到的问题,但是当我进行单元测试时,我真的不想测试第 3 方方法或集成测试并将其称为单元测试。
我希望能够模拟该类以返回垃圾文本进行测试。
我苦苦挣扎的地方是 AmazonS3ClientBuilder。
我如何创建一个 bean 来返回 this 的一个实例而不做这样的事情。
@Configuration
Public class config {
@Bean
public AmazonS3ClientBuilder amazonS3ClientBuilder{
return AmazonS3ClientBuilder.standard();
}
}
这是我目前的使用方式。
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSSTaticCredentialsProvider(credentaials)).withRegion(region).build();
我是不是看错了,应该为客户端而不是构建器注入 AmazonS3?
提前致谢。
【问题讨论】:
-
我认为您应该注入实际的 S3Client,并将其构造和配置留在您的 Configuration 类中。然后,当您的测试运行时,您可以使用 Mockito 之类的东西配置另一个返回模拟的 S3Client Bean。
-
如果创建客户端所需的输入直到运行时才知道,我将如何适应它,因为没有它我将无法创建客户端。
-
一般情况下,或者专门针对您的测试用例,您将如何适应?
-
touche... 我想我需要一种机制来获取区域、凭据并返回客户端。在第 3 方课上,我没有看到这样做的方法。
-
我也是这么想的。无论您是否注入构建器,您仍然需要在运行时定义所有这些东西(区域、凭据等),唯一的区别是您是在 bean 配置中还是在其他使用构建器的地方进行定义。这也是我只注入客户端本身更有意义的原因,因为理想情况下,该客户端的消费者不需要进行额外的配置,他们应该只接收一个预构建的客户端。
标签: java spring amazon-s3 dependency-injection