我正在为一个类编写单元测试,该类具有静态最终变量。 然而,由于静态最终变量的状态在每次测试中都会被修改,所以我需要某种方法来重新初始化它。
这怎么可能呢?我需要使用某种自定义类加载器吗?
该变量被初始化为 -
静态最终 CountdownLatch 闩锁 = new CountdownLatch(1);
当然,您可以通过反射或类加载来解决它,但是“如果我是您,我就不会在这里开始表单。”可变静态确实是邪恶的(即使是那些称为单例的)。因此,通过“从上面参数化”更好地设计代码 - 将对象传递给需要它们的人,而不是做一些硬连线或使用目录服务。
可以通过反射更改静态final。 (有关代码示例,请参阅此链接)...但我建议您不要这样做。事实上,过去已经表明,如果可能的话,应该避免静态变量。 Commons Logging 就是一个很好的例子。 (查看解释这里)。
因此,如果可能的话,摆脱final 甚至 static。如果这不是选项,您可以编写一个通过反射来完成此操作的辅助函数。但这肯定是最糟糕的选择。
您可以为每个测试方法创建一个单独的类,然后使用
perTest
的 forkmode。正如
Ant junit 任务文档所述:
如果您想分叉一些测试,则控制创建多少个 Java 虚拟机。可能的值为“perTest”(默认值)、“perBatch”和“once”。 “once”仅为所有测试创建一个 Java VM,而“perTest”为每个 TestCase 类创建一个新 VM。 “perBatch”为每个嵌套创建一个虚拟机,并收集所有嵌套
。请注意,只有使用相同的 filtertrace、haltonerror、haltonfailure、errorproperty 和 failureproperty 设置的测试才能共享 VM,因此即使将 forkmode 设置为“once”,Ant 也可能必须创建多个 Java VM。对于未分叉到新 Java VM 的测试,此属性将被忽略。从 Ant 1.6.2 开始
也许你可以模拟初始化变量的方法?
示例:static Final int number = getNumber();
通过模拟 getNumber() 方法返回您想要的值,您可以控制“number”变量。
标记为
final的变量仅被修改一次,这似乎在您的不同测试中发生一次。 如果您使用 JUnit,为什么不在每次调用 setup() 时创建该类的新实例,setup() 本身会在每次测试之前调用。 这将是最快、最能代表您情况的方法。
一个好的静态最终变量是保存有关环境的某种状态的变量。例如,您的操作系统的变量。你甚至不会在测试中改变它。这种情况你需要在不同的机器上(或者至少是虚拟机)进行测试。
但是您想用不同的值测试这个变量。所以看来这里的修饰符之一是错误的,静态的或最终的,其中之一与你在这里需要的语义不匹配,否则你不会想用不同的值来测试它。
您能提供有关该问题的更多详细信息吗?