#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 {
//...
}
Ответ №1:
Окончательное мое решение :
@After
public void tearDown() {
mongoTemplate.remove(new Query(), MyCardDO.class);
}
@AfterClass
public static void finalClean() {
mongoTemplate.dropCollection(MyCardDO.class);
}
то есть после завершения каждого метода тестирования удалять только все записи и в финале, когда весь тестовый класс завершен, удалять коллекцию.