我需要帮助使用Java中使用Mockito模拟AWS API。由于我试图模拟RDS连接,但连接返回NULL语句对象。我必须模拟S3,AWS数据管道,JavaSaprkContext
,RDS Connection,Lambda,SNS和DynamoDB。
这是我用于RDS连接的代码,它返回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()'");
}
}
除了Whummer和Shachar的答案外:
如果您是幸运的Junit 5用户,请让我推荐您为AWS*的Junit 5扩展名*,一些Junit 5扩展名可用于测试与AWS相关的代码。这些扩展名可用于为AWS服务客户端提供由LocalStack(或真实的)提供的客户端注入客户端。支持两个AWS Java SDK V 2.x和V 1.x。
*我维护此库
永远不要模拟您不知道它们的行为的API/类型。一个更好的解决方案是添加自己的API,即其实施之一将是AWS。然后,您可以模拟自己的API
那里有一些相当复杂的云服务模拟框架,例如,Moto具有模拟实现,其功能与实际的S3 API非常相似。
您还可以查看LocalStack,该框架结合了现有工具并提供了功能齐全的本地云环境,可用于集成测试。
尽管其中一些工具是用其他语言编写的(python,node.js),但在Java测试类中的外部过程中旋转测试环境应该很容易。