无法对 dynamodb class 进行 运行 的 Junit 测试

Cannot get Junit test to run for dynamodb class

我有一个 class 从 dynamo db table 扫描列,同时使用 aws sdk java(为简单起见取出主要方法):

public class fetchCmdbColumn {
    
    public static List<String> CMDB(String tableName, String tableColumn) throws Exception {

        DynamoDbClient client = DynamoDbClient.builder()
                .region(Region.EU_WEST_1)
                .build();
        List<String> ListValues = new ArrayList<>();
        
        try {
            
            ScanRequest scanRequest = ScanRequest.builder()
                        .tableName(tableName)
                        .build();
            ScanResponse response = client.scan(scanRequest);

            for (Map<String, AttributeValue> item : response.items()){
                Set<String> keys = item.keySet();
                for (String key : keys) {
                    
                    if (key == tableColumn) {
                        ListValues.add(item.get(key).s()) ;
                    }
                }
            }
            //To check what is being returned, comment out below
           // System.out.println(ListValues);
            
        } catch (DynamoDbException e){
            e.printStackTrace();
            System.exit(1);
        }
        client.close();
        return ListValues;
        
    }
}

我还为此创建了一个 junit 测试 class:

public class fetchCMDBTest {


    // Define the data members required for the test
    private static String tableName = "";
    private static String tableColumn = "";


    @BeforeAll
    public static void setUp() throws IOException {

        // Run tests on Real AWS Resources
        try (InputStream input = fetchCMDBTest.class.getClassLoader().getResourceAsStream("config.properties")) {

            Properties prop = new Properties();

            if (input == null) {
                System.out.println("Sorry, unable to find config.properties");
                return;
            }

            //load a properties file from class path, inside static method
            prop.load(input);

            // Populate the data members required for all tests
            tableName = prop.getProperty("environment_list");
            tableColumn = prop.getProperty("env_name");


        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Test
    void fetchCMDBtable() throws Exception{
        try {
            fetchCMDB.CMDB(tableName, tableColumn);
            System.out.println("Test 1 passed");
        } catch (Exception e) {
            System.out.println("Test 1 failed!");
            e.printStackTrace();
        }
        
    }   
}

当我 运行 使用 mvn test 进行测试时,出现错误:

software.amazon.awssdk.core.exception.SdkClientException: Multiple HTTP implementations were found on the classpath ,

尽管我只在 class 中声明了一次客户端生成器。

我错过了什么?

我 运行 来自 IntelliJ IDE 的 UNIT 测试。我发现使用 IDE 比命令行更好。一旦我设置了包含测试值的 config.properties 文件和 运行 它们,所有测试都会通过——如下所示:

事实上 - 我们以这种方式测试所有 Java V2 代码示例以确保它们都能正常工作。

我还使用 mvn test 从命令行测试了所有 DynamoDB 示例。全部通过:

修改您的测试以构建 DynamoDB 客户端的单个实例,然后作为您的第一个测试,确保它已成功创建。看看这是否适合你。完成此工作后,添加更多测试!

public class DynamoDBTest {

    private static DynamoDbClient ddb;

   

    @BeforeAll
    public static void setUp() throws IOException {

        // Run tests on Real AWS Resources
        Region region = Region.US_WEST_2;
        ddb = DynamoDbClient.builder().region(region).build();
        try (InputStream input = DynamoDBTest.class.getClassLoader().getResourceAsStream("config.properties")) {

            Properties prop = new Properties();

            if (input == null) {
                System.out.println("Sorry, unable to find config.properties");
                return;
            }

            //load a properties file from class path, inside static method
            prop.load(input);

           

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Test
    @Order(1)
    public void whenInitializingAWSService_thenNotNull() {
        assertNotNull(ddb);
        System.out.println("Test 1 passed");
    }

原来我的 pom 文件包含其他客户端,所以不得不删除类似的内容:

       <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>software.amazon.awssdk</groupId>
                    <artifactId>netty-nio-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>software.amazon.awssdk</groupId>
                    <artifactId>apache-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

并将它们替换为:

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>aws-crt-client</artifactId>
        <version>2.14.13-PREVIEW</version>
    </dependency>

https://aws.amazon.com/blogs/developer/introducing-aws-common-runtime-http-client-in-the-aws-sdk-for-java-2-x/

所述

作为对其他答案的补充,对我来说只适用于 option 4 from the reference

Option 4: Change the default HTTP client using a system property in Java code.

我在使用 JUnit 5 的集成测试的 setUp() 方法中定义了它。

@BeforeAll
public static void setUp() {
    System.setProperty(
         SdkSystemSetting.SYNC_HTTP_SERVICE_IMPL.property(), 
         "software.amazon.awssdk.http.apache.ApacheSdkHttpService");
}

因为我正在使用 gradle:

    implementation ("software.amazon.awssdk:s3:${awssdk2Version}") {
        exclude group: 'software.amazon.awssdk', module: 'netty-nio-client'
        exclude group: 'software.amazon.awssdk', module: 'apache-client'
    }
    implementation "software.amazon.awssdk:aws-crt-client:2.17.71-PREVIEW"