如何在java中使用Mockito模拟AWS API

时间:2016-06-21 18:51:36

标签: java amazon-web-services amazon-s3 mockito

我需要帮助在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()'");

    }
}

3 个答案:

答案 0 :(得分:1)

Never mock APIs/types你不知道他们的行为方式。一个更好的解决方案是添加自己的API,其中一个实现将是AWS。然后,您就可以模拟自己的API

答案 1 :(得分:0)

有一些相当复杂的云服务模拟框架,例如moto有一个模拟实现,其功能与实际的S3 API非常相似。

您还可以查看LocalStack,这是一个结合了现有工具的框架,可提供可用于集成测试的全功能本地云环境。

虽然其中一些工具是用其他语言编写的(Python,Node.js),但是从Java测试类开始在外部进程中调试测试环境应该很容易。

答案 2 :(得分:0)

除了whummer'sshachar's答案:

如果您是JUnit 5的幸运用户,请允许我向您推荐JUnit 5 extensions for AWS,这是一些JUnit 5扩展,可用于测试与AWS相关的代码。这些扩展可用于为由诸如localstack(或实际)之类的工具提供的AWS服务客户端注入客户端。 AWS Java SDK v 2.x和v 1.x均受支持。