gpt4 book ai didi

spring-boot - 如何让spring data mongodb在每个测试方法之前执行createIndexes?

转载 作者:行者123 更新时间:2023-12-04 02:45:07 26 4
gpt4 key购买 nike

MongoDB Entity 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

最佳答案

我的最终决定:

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

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

关于spring-boot - 如何让spring data mongodb在每个测试方法之前执行createIndexes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55205667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com