0

我对上述问题的猜测是这是不可能的,但我需要确认。所以问题是私有静态最终字符串中有一个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 文字。有没有办法修改它?(我不能更改代码库,我只需要编写单元测试)。我也试过这段代码:

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

2 回答 2

1

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

通常,您应该在测试中像在生产中一样对待针对不同数据库的处理。相同的旧质量软件工程,通常不涉及反射。

于 2012-10-22T13:32:23.347 回答
0

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

于 2012-10-22T13:32:35.640 回答