как разрешить spring data mongodb выполнять createIndexes перед каждым методом тестирования?

#spring-boot #spring-data-mongodb

#spring-boot #spring-data-mongodb

Вопрос:

В поле объекта MongoDB MyCardDO явно задайте для него значение unique

 @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);

}
  

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
введите описание изображения здесь

Ответ №1:

Окончательное мое решение :

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

то есть после завершения каждого метода тестирования удалять только все записи и в финале, когда весь тестовый класс завершен, удалять коллекцию.