Поле MongoDB Entity MyCardDO, явно установите его уникальным
@Indexed(unique=true)
private String uid;
, и есть MyCardService
для грубой MyCardDO, и есть MyCardServiceTest
для проверки MyCardService
, естьadd_repeat_uid_record_failed
внутренний MyCardServiceTest для тестирования идентификатора не может быть продублирован,
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 Iзнать, что createIndexes
выполняется только один раз, если отбросить коллекцию, он не будет снова создаватьIndexes
@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