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

问题描述 投票:3回答:1

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

Wireshark截图enter image description here

spring-boot spring-data-mongodb
1个回答
0
投票

最后我的决议:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.