Spring data mongodb 唯一索引(@Indexed)单元测试注意事项

7次阅读

共计 1089 个字符,预计需要花费 3 分钟才能阅读完成。

问题
Spring data mongodb Entity 有一个字段设置了唯一索引
@Indexed(unique=true)
private String uid;

测试不能添加 uid 重复的记录
/**
* 测试插入 UID 重复记录失败
*/
MyCardDO myCardDO1 = new MyCardDO();
myCardDO1.setUid(“1”);
myCardService.add(myCardDO1);

try {
MyCardDO myCardDO2 = new MyCardDO();
myCardDO2.setUid(“1”);
myCardService.add(myCardDO2);

Assert.fail();
} catch (DuplicateKeyException e) {
assertTrue(e.getMessage().contains(“E11000 duplicate key error collection: opportunity-test.pro_mycard index: uid dup key: { : \”1\”}”));
}

单独执行这个测试方法没有问题 如果执行整个测试类的话 这个测试方法就会通不过
原因
会在每个测试方法结束后 删除 collection
@After
public void tearDown() {
mongoTemplate.dropCollection(MyCardDO.class);
}

而 Spring data mongodb 只会执行一次 createIndex 操作 一旦已经执行过了 之后就不会再执行了于是之后的测试方法执行的时候 collection 是没有索引存在的 故会报错
补充
一旦 org.springframework.data.mapping.context.AbstractMappingContext#persistentEntities 已经缓存了该 Entity 那么之后就不会执行 createIndex 操作了
org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator#createIndex

解决
@After
public void tearDown() {
mongoTemplate.remove(new Query(), MyCardDO.class);
}
@AfterClass
public static void finalClean() {
mongoTemplate.dropCollection(MyCardDO.class);
}
每个方法执行完后 只是清空 collection 中的数据 等整个测试类执行完后才去 drop

正文完
 0