Spring data mongodb 惟一索引(@Indexed)單元測試注意事項

問題

Spring data mongodb Entity有一個字段設置了惟一索引spring

@Indexed(unique=true)
private String uid;

測試不能添加uid重複的記錄mongodb

/**
     *  測試插入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\" }"));
    }

單獨執行這個測試方法沒有問題 若是執行整個測試類的話 這個測試方法就會通不過緩存

緣由

會在每一個測試方法結束後 刪除collectionapp

@After
public void tearDown() {
    mongoTemplate.dropCollection(MyCardDO.class);
}

而Spring data mongodb 只會執行一次createIndex操做 一旦已經執行過了 以後就不會再執行了
因而以後的測試方法執行的時候 collection是沒有索引存在的 故會報錯測試

補充

一旦org.springframework.data.mapping.context.AbstractMappingContext#persistentEntities已經緩存了該Entity 那麼以後就不會執行createIndex操做了ui

org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator#createIndex

解決

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

每一個方法執行完後 只是清空collection中的數據 等整個測試類執行完後纔去dropcode

相關文章
相關標籤/搜索