我正在尝试设置一个服务,根据存储桶,密钥和区域从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?
提前致谢。
答案 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实现从需要处理存储的类中抽象出来的方法。