【发布时间】:2012-10-22 13:26:54
【问题描述】:
我对上述问题的猜测是这是不可能的,但我需要确认。所以问题是私有静态最终字符串中有一个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);
【问题讨论】:
-
你为什么不把你的最终字符串复制到另一个非最终字符串变量中?
-
编译时已知的常量可以被 javac 编译器内联,所以即使你改变了原来的,它在任何地方都不会改变。
-
如果您的原始查询需要更改以使用 HSQL 进行测试,那么您正在测试什么?
-
感谢大家的回复!此 SELECT 位于原始代码库中,该代码库检索一些记录并且正在处理这些实体。我想测试这种处理机制,但不使用 Oracle 数据库。这就是我使用 HSQL 的原因。这就是为什么这个 String 应该被改变的原因。我不允许修改原始代码,因为它已经在生产中。彼得:你有同样的意见是不可能修改的吗?再次感谢!
标签: java oracle unit-testing mocking hsqldb