MongoDB实体MyCardDO的字段,将其显式设置为唯一
@Indexed(unique=true)
private String uid;
有一个MyCardService
可以填充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);
}
p.s。
@RunWith(SpringRunner.class)
@DataMongoTest(includeFilters = @ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,value={MyCardService.class}))
@ActiveProfiles("test")
@Import(SpringMongoConfig.class)
public class MyCardServiceTest {
//...
}
答案 0 :(得分:0)
最后我的决心:
@After
public void tearDown() {
mongoTemplate.remove(new Query(), MyCardDO.class);
}
@AfterClass
public static void finalClean() {
mongoTemplate.dropCollection(MyCardDO.class);
}
每个测试方法完成后,只删除所有记录,最后在整个测试类完成后删除集合。