2017-07-17 175 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