是否可以模拟私有静态最终字符串文字?

时间:2012-10-22 13:26:55

标签: java oracle unit-testing mocking hsqldb

我对上述问题的猜测是,这是不可能的,但我需要确认。所以问题是私有静态最终字符串中存在Oracle特定的SELECT(使用ROWNUM和FOR UPDATE SKIP LOCKED关键字)。

private static final String REC_QUERY_SELECT = "SELECT * FROM ... WHERE ROWNUM <=1 for update skip locked";

我想对HSQL进行单元测试,但HSQL不知道这些Oracle关键字。我想修改REC_QUERY_SELECT变量(将SELECT修改为更简单的变量)但我不能因为它是final和String literal。 有没有办法修改它? (我不能改变代码库,我只需编写单元测试)。我也试过这个代码:

field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);

2 个答案:

答案 0 :(得分:1)

作为编译时内容(参见JLS),字符串将在编译时复制到调用站点,因此在运行时更改该值可能无济于事。

通常,您应该将测试中的不同数据库定位与生产中相同。相同的旧质量软件工程,通常不涉及反射。

答案 1 :(得分:0)

使用ASM,您可以就地修改目标类的字节代码,并在运行时使用修改后的类。