MongoDB实体MyCardDO的字段,明确地将其设置为唯一
@Indexed(unique=true)
private String uid;
并且有一个MyCardService
来crud MyCardDO,并且有一个MyCardServiceTest
来测试MyCardService
,有一个add_repeat_uid_record_failed
内部MyCardServiceTest来测试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\" }"));
}
如果我直接运行这个测试方法就可以了,但我运行整个MyCardServiceTest
这个方法失败了,而且从Wireshark我知道createIndexes
只执行一次,如果删除了集合它将不会再创建索引
@After
public void tearDown() {
mongoTemplate.dropCollection(MyCardDO.class);
}
那么如何让spring在每个测试方法之前执行createIndexes呢?那是
@Before
public void setUp() {
// how to auto execute createIndexes before every test method
// prepare some test data
myCardService.add(myCardDO1);
}
附:
@RunWith(SpringRunner.class)
@DataMongoTest(includeFilters = @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,value={MyCardService.class}))
@ActiveProfiles("test")
@Import(SpringMongoConfig.class)
public class MyCardServiceTest {
//...
}
最后我的决议:
@After
public void tearDown() {
mongoTemplate.remove(new Query(), MyCardDO.class);
}
@AfterClass
public static void finalClean() {
mongoTemplate.dropCollection(MyCardDO.class);
}
完成每个测试方法后,只删除所有记录,最后在整个测试类完成后删除集合。