【问题标题】:How to mock AWS API using Mockito in java如何在 java 中使用 Mockito 模拟 AWS API
【发布时间】:2016-06-21 18:51:36
【问题描述】:

我需要帮助来使用 Java 中的 Mockito 模拟 AWS API。正如我试图模拟 RDS 连接但连接返回空语句对象。我必须模拟 S3、AWS 数据管道、JavaSaprkContext、RDS 连接、Lambda、SNS 和 DynamoDB。

这是我的 RDS 连接代码,它返回空语句对象:

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()'");

    }
}

【问题讨论】:

  • 您的第一个测试是一个单元测试,旨在测试Statement。您的第二个测试是一个单元测试,旨在测试S3Util。我认为这些都不是您拥有的代码。
  • 换句话说,您提供的两段代码都没有测试主题。你的测试目标是什么?除了 API 代码之外,您的任何测试都没有提供任何类型的目标,这不应该是需要检查的东西。

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


【解决方案1】:

除了whummer'sshachar's 答案:

如果您是一位幸运的 JUnit 5 用户,让我向您推荐 JUnit 5 extensions for AWS*,这是一些 JUnit 5 扩展,它们可能对测试 AWS 相关代码很有用。这些扩展可用于为本地堆栈(或真实工具)等工具提供的 AWS 服务客户端注入客户端。支持 AWS Java SDK v 2.x 和 v 1.x。

*我维护这个库

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您能否分享一段代码来说明您使用任何 AWS 服务的评论
    • 这不是把问题只转移了一层吗?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2011-03-13
      • 2020-03-30
      • 1970-01-01
      • 2019-03-13
      • 2022-06-15
      相关资源
      最近更新 更多