- 对数据持久层进行测试时,需要连接数据库.一个好的DAO测试应该保证数据库在测试前后状态一致,不留新添数据,回滚所有更新.为了防止测试数据污染数据库,实际开发过程中一般是不允许直接对实际数据库进行写操作的.
- 这种情况使用内存数据库是个不错选择。每次测试前都能保证数据库是空空的,没有任何表,并且测试完成后不留痕迹.
- aws提供了dynamodb local来作为测试用的内存数据库
mvn setting位于~/.m2/setting.xml, 配置文件如下,对dynamodb-local以外的其他资源都使用阿里云镜像进行下载.
配置pomjdk-1.8 true1.8 1.8 1.8 1.8 true true aliyunmaven *,!dynamodb-local alirepo https://maven.aliyun.com/repository/public
整个pom文件配置如下,相比之前,增加了以下内容:
- 添加DynamoDBLocal的依赖
- 配置DynamoDBLocal的repository
- 使用plugin配置 in memory database的路径
创建LocalDynamoDBCreationRule4.0.0 com.jessica dynamodb-in-action0.0.1-SNAPSHOT jar dynamodb-in-action http://maven.apache.org UTF-8 UTF-8 UTF-8 1.8 1.8 1.8 1.8 com.amazonaws aws-java-sdk-dynamodb1.12.60 org.projectlombok lombok1.18.20 provided junit junit4.12 test com.amazonaws DynamoDBLocal1.15.0 dynamodb-local DynamoDB Local Release Repository https://s3-us-west-2.amazonaws.com/dynamodb-local/release org.apache.maven.plugins maven-dependency-plugin2.10 copy test-compile copy-dependencies test so,dll,dylib ${project.basedir}/target/native-libs
package com.jessica.dynamodb.local;
import java.io.IOException;
import java.net.ServerSocket;
import org.junit.rules.ExternalResource;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.local.main.ServerRunner;
import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
public class LocalDynamoDBCreationRule extends ExternalResource {
private DynamoDBProxyServer server;
private DynamoDBMapper dynamoDBMapper;
private DynamoDB dynamoDB;;
public LocalDynamoDBCreationRule() {
// This one should be copied during test-compile time. If project's basedir does
// not contains a folder
// named 'native-libs' please try '$ mvn clean install' from command line first
System.setProperty("sqlite4java.library.path", "target/native-libs");
}
@Override
protected void before() throws Throwable {
try {
final String port = getAvailablePort();
this.server = ServerRunner.createServerFromCommandLineArgs(new String[] { "-inMemory", "-port", port });
server.start();
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withEndpointConfiguration(new EndpointConfiguration("http://localhost:" + port, "ap-southeast-1"))
.build();
dynamoDBMapper = new DynamoDBMapper(client);
dynamoDB = new DynamoDB(client);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void after() {
if (server == null) {
return;
}
try {
server.stop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public DynamoDBMapper getDynamoDBMapper() {
return dynamoDBMapper;
}
public void crateTable(CreateTableRequest request) {
try {
System.out.println("Issuing CreateTable request for " + request.getTableName());
Table table = dynamoDB.createTable(request);
System.out.println("Waiting for " + request.getTableName() + " to be created...this may take a while...");
table.waitForActive();
System.out.println("Create " + request.getTableName() + " success");
} catch (Exception e) {
System.err.println("CreateTable request failed for " + request.getTableName());
System.err.println(e.getMessage());
}
}
private String getAvailablePort() {
try (final ServerSocket serverSocket = new ServerSocket(0)) {
return String.valueOf(serverSocket.getLocalPort());
} catch (IOException e) {
throw new RuntimeException("Available port was not found", e);
}
}
}
创建unit test
以BasicDaoImplTest为例
package com.jessica.dynamodb.local;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.BillingMode;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.LocalSecondaryIndex;
import com.amazonaws.services.dynamodbv2.model.Projection;
import com.amazonaws.services.dynamodbv2.model.ProjectionType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.SSESpecification;
import com.amazonaws.services.dynamodbv2.model.Tag;
import com.jessica.dynamodb.constant.DynamoDBConstant;
import com.jessica.dynamodb.favorite.dao.BasicDao;
import com.jessica.dynamodb.favorite.dao.impl.BasicDaoImpl;
import com.jessica.dynamodb.favorite.data.LazyLoadResult;
import com.jessica.dynamodb.favorite.dto.TagDto;
public class BasicDaoImplTest {
@ClassRule
public static final LocalDynamoDBCreationRule localDynamoDB = new LocalDynamoDBCreationRule();
BasicDao basicDao = new BasicDaoImpl<>(localDynamoDB.getDynamoDBMapper());
@BeforeClass
public static void createTable() {
// attributes
List attributeDefinitions = new ArrayList();
attributeDefinitions
.add(new AttributeDefinition().withAttributeName(DynamoDBConstant.HASH_KEY).withAttributeType("S"));
attributeDefinitions
.add(new AttributeDefinition().withAttributeName(DynamoDBConstant.RANGE_KEY).withAttributeType("S"));
attributeDefinitions.add(
new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_ONE_HASH_KEY).withAttributeType("S"));
attributeDefinitions.add(
new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_ONE_RANGE_KEY).withAttributeType("S"));
attributeDefinitions.add(
new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_TWO_HASH_KEY).withAttributeType("S"));
attributeDefinitions.add(
new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_TWO_RANGE_KEY).withAttributeType("S"));
attributeDefinitions.add(new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_THREE_HASH_KEY)
.withAttributeType("S"));
attributeDefinitions.add(new AttributeDefinition().withAttributeName(DynamoDBConstant.GSI_THREE_RANGE_KEY)
.withAttributeType("S"));
attributeDefinitions.add(
new AttributeDefinition().withAttributeName(DynamoDBConstant.LSI_ONE_RANGE_KEY).withAttributeType("S"));
// table key schema
List keySchema = new ArrayList();
keySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.HASH_KEY).withKeyType(KeyType.HASH));
keySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.RANGE_KEY).withKeyType(KeyType.RANGE));
// provisioned Throughput
ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput().withReadCapacityUnits(1L)
.withWriteCapacityUnits(1L);
// local secondary index
List localSecondaryIndexs = new ArrayList<>();
List lsioneKeySchema = new ArrayList();
lsioneKeySchema
.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.HASH_KEY).withKeyType(KeyType.HASH));
lsiOneKeySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.LSI_ONE_RANGE_KEY)
.withKeyType(KeyType.RANGE));
localSecondaryIndexs.add(
new LocalSecondaryIndex().withIndexName(DynamoDBConstant.LSI_ONE_NAME).withKeySchema(lsiOneKeySchema)
.withProjection(new Projection().withProjectionType(ProjectionType.ALL)));
// global secondary index
List globalSecondaryIndexs = new ArrayList<>();
List gsioneKeySchema = new ArrayList();
gsiOneKeySchema.add(
new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_ONE_HASH_KEY).withKeyType(KeyType.HASH));
gsiOneKeySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_ONE_RANGE_KEY)
.withKeyType(KeyType.RANGE));
List gsiTwoKeySchema = new ArrayList();
gsiTwoKeySchema.add(
new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_TWO_HASH_KEY).withKeyType(KeyType.HASH));
gsiTwoKeySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_TWO_RANGE_KEY)
.withKeyType(KeyType.RANGE));
List gsiThreeKeySchema = new ArrayList();
gsiThreeKeySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_THREE_HASH_KEY)
.withKeyType(KeyType.HASH));
gsiThreeKeySchema.add(new KeySchemaElement().withAttributeName(DynamoDBConstant.GSI_THREE_RANGE_KEY)
.withKeyType(KeyType.RANGE));
globalSecondaryIndexs.add(new GlobalSecondaryIndex().withIndexName(DynamoDBConstant.GSI_ONE_NAME)
.withKeySchema(gsiOneKeySchema).withProjection(new Projection().withProjectionType(ProjectionType.ALL))
.withProvisionedThroughput(provisionedThroughput));
globalSecondaryIndexs.add(new GlobalSecondaryIndex().withIndexName(DynamoDBConstant.GSI_TWO_NAME)
.withKeySchema(gsiTwoKeySchema).withProjection(new Projection().withProjectionType(ProjectionType.ALL))
.withProvisionedThroughput(provisionedThroughput));
globalSecondaryIndexs.add(new GlobalSecondaryIndex().withIndexName(DynamoDBConstant.GSI_THREE_NAME)
.withKeySchema(gsiThreeKeySchema)
.withProjection(new Projection().withProjectionType(ProjectionType.ALL))
.withProvisionedThroughput(provisionedThroughput));
SSESpecification sseSpecification = new SSESpecification().withEnabled(false);
Tag tag = new Tag().withKey("product").withValue("local-test");
CreateTableRequest request = new CreateTableRequest().withTableName("develop.Favorite")
.withAttributeDefinitions(attributeDefinitions).withKeySchema(keySchema)
.withBillingMode(BillingMode.PROVISIONED).withProvisionedThroughput(provisionedThroughput)
.withLocalSecondaryIndexes(localSecondaryIndexs).withGlobalSecondaryIndexes(globalSecondaryIndexs)
.withSSESpecification(sseSpecification).withTags(tag);
localDynamoDB.crateTable(request);
}
@Test
public void testSaveLoadDelete() {
// prepare data
String userId = "userId1";
String tagId = UUID.randomUUID().toString();
String tagName = "firstTag";
Date now = new Date();
TagDto newTagDto = TagDto.builder().userId(userId).tagId(tagId).tagName(tagName).createTime(now.getTime())
.lastAccessTime(now.getTime()).build();
// run test
basicDao.save(newTagDto);
TagDto loadedDto = basicDao.load(newTagDto);
assertNotNull(loadedDto);
// clean data
basicDao.delete(newTagDto);
loadedDto = basicDao.load(newTagDto);
assertNull(loadedDto);
}
@Test
public void testBatchSaveLoadDelete() {
// prepare data
String userId1 = "userId1";
String tagId1 = UUID.randomUUID().toString();
String tagName1 = "firstTag";
Date date1 = new Date();
String userId2 = "userId2";
String tagId2 = UUID.randomUUID().toString();
String tagName2 = "secondTag";
Date date2 = new Date();
TagDto newTagDto1 = TagDto.builder().userId(userId1).tagId(tagId1).tagName(tagName1).createTime(date1.getTime())
.lastAccessTime(date1.getTime()).build();
TagDto newTagDto2 = TagDto.builder().userId(userId2).tagId(tagId2).tagName(tagName2).createTime(date2.getTime())
.lastAccessTime(date2.getTime()).build();
List dtos = Arrays.asList(newTagDto1, newTagDto2);
basicDao.batchSave(dtos);
// run test
List loadedDtos = basicDao.batchLoad(dtos);
assertEquals(2, loadedDtos.size());
// clean data
basicDao.batchDelete(dtos);
// run test
loadedDtos = basicDao.batchLoad(dtos);
assertEquals(0, loadedDtos.size());
}
@Test
public void testQuery() {
// prepare data
String userId1 = "userId1";
String tagId1 = "firstTag";
String tagName1 = "firstTag";
Date date = new Date();
String tagId2 = "secondTag";
String tagName2 = "secondTag";
String tagId3 = "thirdTag";
String tagName3 = "thirdTag";
String tagId4 = "fouthTag";
String tagName4 = "fouthTag";
String userId2 = "userId2";
String tagId5 = "fifthTag";
String tagName5 = "fifthTag";
TagDto newTagDto1 = TagDto.builder().userId(userId1).tagId(tagId1).tagName(tagName1)
.createTime(date.getTime() - 10000).lastAccessTime(date.getTime() - 10000).build();
TagDto newTagDto2 = TagDto.builder().userId(userId1).tagId(tagId2).tagName(tagName2)
.createTime(date.getTime() - 5000).lastAccessTime(date.getTime() - 5000).build();
TagDto newTagDto3 = TagDto.builder().userId(userId1).tagId(tagId3).tagName(tagName3)
.createTime(date.getTime() - 1000).lastAccessTime(date.getTime() - 1000).build();
TagDto newTagDto4 = TagDto.builder().userId(userId1).tagId(tagId4).tagName(tagName4).createTime(date.getTime())
.lastAccessTime(date.getTime()).build();
TagDto newTagDto5 = TagDto.builder().userId(userId2).tagId(tagId5).tagName(tagName5).createTime(date.getTime())
.lastAccessTime(date.getTime()).build();
List dtos = Arrays.asList(newTagDto1, newTagDto2, newTagDto3, newTagDto4, newTagDto5);
basicDao.batchSave(dtos);
try {
// test sk desc order with size
LazyLoadResult lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, false, null, 2);
assertEquals(2, lazyLoadResult.getLoadedDtos().size());
assertEquals(true, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(1).getTagId());
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, false,
lazyLoadResult.getLoadedDtos().get(1).getSk(), 3);
assertEquals(2, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(1).getTagId());
// test sk aes order with size
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, true, null, 2);
assertEquals(2, lazyLoadResult.getLoadedDtos().size());
assertEquals(true, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(1).getTagId());
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, true,
lazyLoadResult.getLoadedDtos().get(1).getSk(), 3);
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(2, lazyLoadResult.getLoadedDtos().size());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(1).getTagId());
// test sk aes order without size
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, true, null, null);
assertEquals(4, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(2).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(3).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(3).getTagId());
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, true, newTagDto4.getSk(), null);
assertEquals(2, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(1).getTagId());
// test sk desc order without size
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, false, null, null);
assertEquals(4, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(2).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(3).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(3).getTagId());
lazyLoadResult = basicDao.query(TagDto.class, newTagDto1, false, newTagDto3.getSk(), null);
assertEquals(3, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(2).getTagId());
} catch (Exception e) {
throw e;
} finally {
// clean data
basicDao.batchDelete(dtos);
}
}
@Test
public void testQueryIndex() {
// prepare data
String userId1 = "userId1";
String tagId1 = UUID.randomUUID().toString();
String tagName1 = "firstTag";
Date date = new Date();
String tagId2 = UUID.randomUUID().toString();
String tagName2 = "secondTag";
String tagId3 = UUID.randomUUID().toString();
String tagName3 = "thirdTag";
String tagId4 = UUID.randomUUID().toString();
String tagName4 = "fouthTag";
TagDto newTagDto1 = TagDto.builder().userId(userId1).tagId(tagId1).tagName(tagName1)
.createTime(date.getTime() - 10000).lastAccessTime(date.getTime() - 10000).build();
basicDao.save(newTagDto1);
TagDto newTagDto2 = TagDto.builder().userId(userId1).tagId(tagId2).tagName(tagName2)
.createTime(date.getTime() - 5000).lastAccessTime(date.getTime() - 5000).build();
basicDao.save(newTagDto2);
TagDto newTagDto3 = TagDto.builder().userId(userId1).tagId(tagId3).tagName(tagName3)
.createTime(date.getTime() - 1000).lastAccessTime(date.getTime() - 1000).build();
basicDao.save(newTagDto3);
TagDto newTagDto4 = TagDto.builder().userId(userId1).tagId(tagId4).tagName(tagName4).createTime(date.getTime())
.lastAccessTime(date.getTime()).build();
List dtos = Arrays.asList(newTagDto1, newTagDto2, newTagDto3, newTagDto4);
basicDao.batchSave(dtos);
try {
// test tag name desc order
LazyLoadResult lazyLoadResult = basicDao.queryIndex(TagDto.class, DynamoDBConstant.GSI_ONE_NAME,
DynamoDBConstant.GSI_ONE_RANGE_KEY, true, TagDto.builder().userId(userId1).build(), false, null, 3);
assertEquals(3, lazyLoadResult.getLoadedDtos().size());
assertEquals(true, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(2).getTagId());
lazyLoadResult = basicDao.queryIndex(TagDto.class, DynamoDBConstant.GSI_ONE_NAME,
DynamoDBConstant.GSI_ONE_RANGE_KEY, true, TagDto.builder().userId(userId1).build(), false,
lazyLoadResult.getLastLoadPos(), 3);
assertEquals(1, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(0).getTagId());
// test load all
lazyLoadResult = basicDao.queryIndex(TagDto.class, DynamoDBConstant.GSI_ONE_NAME,
DynamoDBConstant.GSI_ONE_RANGE_KEY, true, TagDto.builder().userId(userId1).build(), false, null,
null);
assertEquals(4, lazyLoadResult.getLoadedDtos().size());
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(2).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(3).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(3).getTagId());
// test tag name aes order
lazyLoadResult = basicDao.queryIndex(TagDto.class, DynamoDBConstant.GSI_ONE_NAME,
DynamoDBConstant.GSI_ONE_RANGE_KEY, true, TagDto.builder().userId(userId1).build(), true, null, 3);
assertEquals(3, lazyLoadResult.getLoadedDtos().size());
assertEquals(true, lazyLoadResult.isHasMore());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId1, lazyLoadResult.getLoadedDtos().get(0).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(1).getUserId());
assertEquals(tagId4, lazyLoadResult.getLoadedDtos().get(1).getTagId());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(2).getUserId());
assertEquals(tagId2, lazyLoadResult.getLoadedDtos().get(2).getTagId());
lazyLoadResult = basicDao.queryIndex(TagDto.class, DynamoDBConstant.GSI_ONE_NAME,
DynamoDBConstant.GSI_ONE_RANGE_KEY, true, TagDto.builder().userId(userId1).build(), true,
lazyLoadResult.getLastLoadPos(), 3);
assertEquals(false, lazyLoadResult.isHasMore());
assertEquals(1, lazyLoadResult.getLoadedDtos().size());
assertEquals(userId1, lazyLoadResult.getLoadedDtos().get(0).getUserId());
assertEquals(tagId3, lazyLoadResult.getLoadedDtos().get(0).getTagId());
} catch (Exception e) {
throw e;
} finally {
// clean data
basicDao.batchDelete(dtos);
}
}
}
完整代码
https://github.com/JessicaWin/dynamodb-in-action/tree/local-dynamodb-test



