2017-07-17 110 views
1

我在寫JPA層和數據庫之間的集成測試來檢查我寫的SQL是否正確。真正的數據庫是Oracle,不幸的是,出於我的控制原因,我的測試數據庫必須是Derby,所以自然會有一些差異。例如我的JPA類具有以下SQL字符串常量JMockit Deencapsulation setField not persisting

private static final String QUERY = "Select * from Users where regexp_like(user_code, '^SS(B)?N')"; 

因爲德比不支持regexp_like我使用JMockits Deencapsulation.setField改變對飛SQL。例如。

@Test 
public void testMyDaoFind() { 
    new Expectations() { 
     { 
      Deencapsulation.setField(MyClass.class, "QUERY", "Select * from Users"); 
     } 
    }; 

    dao.findUsers(); 
} 

現在忽略了一個事實,這不是因爲它不是測試,將真實的數據庫上運行的實際查詢一個很好的測試(這純粹是爲了滿足我的好奇心,什麼是怎麼回事),我從Eclipselink/Derby獲得SQL異常錯誤,抱怨regexp_like不被識別爲函數或過程。

如果我把在試圖得到的結果列表中的DAO行一個破發點,我可以從一個新的手錶看到

  1. JMockit已經取代正確的查詢

  2. getResultList()返回數據,我期待看到

但是,如果我讓測試貫穿然後一路我得到的afformentioned例外?

回答

2

Java中的字符串未按照您的想法處理。 Java源代碼編譯器用字符串存儲的固定「地址」(在類的常量池中)替換讀取字段中的字符串。該字段在運行時不再被讀取。因此,即使JMockit替換字段中存儲的字符串引用,它也沒有任何區別,因爲客戶端代碼不會使用該字段看到該引用。

(順便說一句,爲什麼是試驗把呼叫Deencapsulatin.setField一個期望塊裏面呢?這樣的塊只意味着記錄的期望......)

底線,沒有辦法實現你在做什麼嘗試去。相反,可以使用Oracle數據庫進行集成測試,也可以使所有SQL代碼可移植,從而避免使用RDBMS特定功能,如regexp_like

+0

非常豐富謝謝你! – PDStat