我需要帮助在Java中使用Mockito来模拟aws apis。因为我试图模拟RDS连接但连接返回null语句对象。我必须模拟S3,AWS Data管道,JavaSaprkContext,RDS连接,Lambda,SNS和DynamoDB。
这是我的RDS Connection代码,它返回null语句对象:
public void testGetRDSConnection() throws SQLException{
Connection connection = mock(Connection.class);
Statement stmt = null;
stmt = connection.createStatement(); // Get NULL statement Object
ResultSet rs = stmt.executeQuery("SELECT * FROM table");
if (rs.next()) {
System.out.println("+ve Test is PASSED Name = testGetRDSConnection ");
} else {
System.out.println("+ve Test is FAILED Name= testGetRDSConnection ");
}
}
和S3的测试用例,返回null元数据对象:
public void testGetObjectMetadata(){
ObjectMetadata obj = S3Util.getObjectMetadata(mock(AmazonS3Client.class), bucketName, filePath);
if (obj == null) {
System.out.println("+ve Test is FAILED Name= 'testGetObjectMetadata()' No metadata found");
fail("+ve Test is FAILED Name= 'testGetObjectMetadata()' No metadata found");
} else if (obj != null) {
System.out.println("+ve Test is FAILED Name= 'testGetObjectMetadata()'");
}
}
答案 0 :(得分:1)
Never mock APIs/types你不知道他们的行为方式。一个更好的解决方案是添加自己的API,其中一个实现将是AWS。然后,您就可以模拟自己的API
答案 1 :(得分:0)
有一些相当复杂的云服务模拟框架,例如moto有一个模拟实现,其功能与实际的S3 API非常相似。
您还可以查看LocalStack,这是一个结合了现有工具的框架,可提供可用于集成测试的全功能本地云环境。
虽然其中一些工具是用其他语言编写的(Python,Node.js),但是从Java测试类开始在外部进程中调试测试环境应该很容易。
答案 2 :(得分:0)
如果您是JUnit 5的幸运用户,请允许我向您推荐JUnit 5 extensions for AWS,这是一些JUnit 5扩展,可用于测试与AWS相关的代码。这些扩展可用于为由诸如localstack(或实际)之类的工具提供的AWS服务客户端注入客户端。 AWS Java SDK v 2.x和v 1.x均受支持。