注入第三方决赛课

时间:2017-11-30 14:34:01

标签: java spring amazon-s3 dependency-injection

我正在尝试设置一个服务,根据存储桶,密钥和区域从AWS KMS(亚马逊的密钥管理服务)中提取加密值。

这样做不是我遇到的问题,但是当我进行单元测试时,我真的不想测试第三方方法或集成测试,并将其称为单元测试。

我希望能够模拟该类只返回垃圾文本进行测试。

我在努力的地方是使用AmazonS3ClientBuilder。

如何在不执行此类操作的情况下创建bean来返回此实例。

@Configuration
Public class config {
    @Bean
    public AmazonS3ClientBuilder amazonS3ClientBuilder{
        return AmazonS3ClientBuilder.standard();
    }
}

以下是我目前使用此功能的方式。

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSSTaticCredentialsProvider(credentaials)).withRegion(region).build();

我是否看错了,应该为客户端而不是构建者注入AmazonS3?

提前致谢。

1 个答案:

答案 0 :(得分:0)

将我们讨论的内容放到一个例子中,如何做到这样:

应用配置

@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
    }
}

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