2017-07-28 61 views
0

期間測試單個更新,我需要修復的安全漏洞,說明異常包含敏感信息,每當應用程序無法更新數據庫數據,我已經通過捕獲數據庫例外固定它,自定義錯誤信息。hibernate.jdbc.batch_size設置爲50不允許例外

要測試此修復程序,我需要執行updateList服務並驗證響應,但在Hibernate中將hibernate.jdbc.batch_size設置爲50,因爲無法測試哪個單一更新,因爲這將始終返回數據更新成功,因爲更新查詢只有當更新計數達到50

將達到數據庫中,我只能測試修復,如果通過將sessionFactory.getCurrentSession()的flush()如下所述。

public void update(final List list) 
{ 
    sessionFactory.getCurrentSession().update(list);  
    sessionFactory.getCurrentSession().flush(); 

} 

有沒有其他的最佳解決方案?或flush()將強制查詢或查詢在數據庫中更新,但不確定對hibernate.jdbc.batch_size = 50的影響;

回答

0

「更新查詢將只命中時更新計數達到50數據庫」這並不完全正確。當事務關閉時它也會打到db。

您可以添加flush,但它可能會導致性能下降(hibernate.jdbc.batch_size=50出於原因)。

我建議你把你嘗試在其他一些地方抓。就像是servlet添加自定義過濾器一樣。它也可以幫助你在不同的地方避免這種例外。用Hibernate很難預測它什麼時候決定刷新數據到數據庫。

+0

如果測試人員將執行手動測試,s(he)會聲稱手動測試用例未按預期工作,因爲它應該拋出異常,但它說數據已成功更新,這是不正確的,我們知道測試人員看到成功的原因,因爲數據還沒有提交,所以我該怎麼辦? – Pawan

+0

爲每個用戶操作打開事務。 Hibernate在事務關閉時刷新未保存的數據。所以手動測試人員會看到異常,因爲交易將被關閉。 – talex

0

有沒有其他的最好的解決辦法?

是的。
要處理單個錯誤案例,您不應以不反映生產中真實實施的方式更改您的實施。
爲什麼?因爲在此測試之後,您必須考慮讓您的實施步驟恢復到生產中的預期行爲。
每次你想測試這個特殊情況時,你都不要忘記做這些改變。
否則,您的應用程序可能無法正常工作。
這不是好的方法。

要測試你的情況,你可以寫一個單元測試
此外,這個不應該依靠真正的數據庫調用。

我提出這種方法進行單元測試:

  1. 素產生與所述消息中的敏感信息異常的對象。
  2. 記錄爲它的行爲。當它被調用時,這個模擬對象會在消息中拋出一個具有類似敏感信息的異常。
  3. 當調用測試方法時,聲明錯誤消息get不包含任何敏感信息。

如果此功能是非常重要的定期測試,並從目標很近的環境中,您可以創建一個集成測試使用相同的約束,在生產中的應用(hibernate.jdbc.batch_size=50)並且在數據庫中至少插入50個數據。

當然,這個測試在時間上可能是昂貴的,應該只在CI工具上自動調用。