要在本地进行DynamoDB单元测试并确保GSI(全局二级索引)已更新,您可以使用AWS SDK提供的模拟器和本地数据库。以下是使用Java SDK进行DynamoDB单元测试的示例代码:
import java.util.HashMap;
import java.util.Map;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;
import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse;
import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteTableResponse;
import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;
import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse;
import software.amazon.awssdk.services.dynamodb.model.GlobalSecondaryIndex;
import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;
import software.amazon.awssdk.services.dynamodb.model.Projection;
import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
import software.amazon.awssdk.services.dynamodb.model.PutItemResponse;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
import software.amazon.awssdk.services.dynamodb.model.TableDescription;
import software.amazon.awssdk.services.dynamodb.model.TableStatus;
import software.amazon.awssdk.services.dynamodb.model.AmazonDynamoDbException;
public class DynamoDBTest {
private DynamoDbClient dynamoDbClient;
public DynamoDBTest(DynamoDbClient dynamoDbClient) {
this.dynamoDbClient = dynamoDbClient;
}
public void createTable(String tableName, String gsiName) {
CreateTableRequest createTableRequest = CreateTableRequest.builder()
.tableName(tableName)
.keySchema(KeySchemaElement.builder().attributeName("id").keyType("HASH").build())
.attributeDefinitions(AttributeDefinition.builder().attributeName("id").attributeType("N").build())
.provisionedThroughput(ProvisionedThroughput.builder()
.readCapacityUnits(5L)
.writeCapacityUnits(5L)
.build())
.globalSecondaryIndexes(GlobalSecondaryIndex.builder()
.indexName(gsiName)
.keySchema(KeySchemaElement.builder().attributeName("name").keyType("HASH").build())
.projection(Projection.builder().projectionType("ALL").build())
.provisionedThroughput(ProvisionedThroughput.builder()
.readCapacityUnits(5L)
.writeCapacityUnits(5L)
.build())
.build())
.build();
CreateTableResponse createTableResponse = dynamoDbClient.createTable(createTableRequest);
System.out.println("Table created: " + createTableResponse.tableDescription().tableName());
}
public void deleteTable(String tableName) {
DeleteTableRequest deleteTableRequest = DeleteTableRequest.builder()
.tableName(tableName)
.build();
DeleteTableResponse deleteTableResponse = dynamoDbClient.deleteTable(deleteTableRequest);
System.out.println("Table deleted: " + deleteTableResponse.tableDescription().tableName());
}
public void putItem(String tableName, String gsiName) {
Map item = new HashMap<>();
item.put("id", AttributeValue.builder().n("1").build());
item.put("name", AttributeValue.builder().s("John").build());
PutItemRequest putItemRequest = PutItemRequest.builder()
.tableName(tableName)
.item(item)
.build();
PutItemResponse putItemResponse = dynamoDbClient.putItem(putItemRequest);
System.out.println("Item added: " + putItemResponse.attributes());
// Wait for GSI to be updated
while (true) {
DescribeTableRequest describeTableRequest = DescribeTableRequest.builder()
.tableName(tableName)
.build();
DescribeTableResponse describeTableResponse = dynamoDbClient.describeTable(describeTableRequest);
TableDescription tableDescription = describeTableResponse.table();
if (tableDescription.tableStatus() == TableStatus.ACTIVE) {
System.out.println("GSI updated");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void scanTable(String tableName) {
ScanRequest scanRequest = ScanRequest.builder()
.tableName(tableName)
.build();
ScanResponse scanResponse = dynamoDbClient.scan(scanRequest);
System.out.println("Scanned items: " + scanResponse.items());
}
public
下一篇:本地Dynamodb控制台