【问题标题】:Inject 3rd party final class注入第 3 方最终课程
【发布时间】: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


【解决方案1】:

将我们讨论过的内容放到一个例子中,这样的事情怎么样:

应用配置

@Configuration
public class Config {
    @Bean
    public AmazonS3 getClient(){
        //TODO: Pull whatever you need from KMS, create credentials, define region, etc
        return AmazonS3ClientBuilder.standard().withRegion("my region").build();
    }

}

这是通常注入应用程序的内容。我没有注入构建器,而是注入了一个预先构建的 S3Client。然后,在我的单元测试中,我可以这样做:

示例单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class SampleTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        public AmazonS3 gets3(){
            System.out.println("Providing mocked s3...");
            //TODO: Provide when/then statements, etc
            return Mockito.mock(AmazonS3.class);
        }
    }

    @Test
    public void testSomething(){
      //TODO: Test something that utilizes S3Client
    }
}

它应该在运行测试时提供 S3Client 的模拟版本。这是一个简单的例子,另一种选择是采用类似的方法,但使用@Profile 来激活测试配置文件。或者,您甚至可以将所有 s3 交互隐藏在另一个类后面,并将其作为一种将 s3 实现从需要处理存储的类中抽象出来的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多