如何让Spring数据mongodb在每个测试方法之前执行createIndexes?

时间:2019-03-17 09:33:07

标签: spring-boot spring-data-mongodb

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 {
    //...
}

Wireshark屏幕截图 enter image description here

1 个答案:

答案 0 :(得分:0)

最后我的决心:

@After
public void tearDown() {
    mongoTemplate.remove(new Query(), MyCardDO.class);
}
@AfterClass
public static void finalClean() {
    mongoTemplate.dropCollection(MyCardDO.class);
}

每个测试方法完成后,只删除所有记录,最后在整个测试类完成后删除集合。