问题
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。