如何在单元测试时重新初始化静态final

问题描述 投票:0回答:7

我正在为一个类编写单元测试,该类具有静态最终变量。 然而,由于静态最终变量的状态在每次测试中都会被修改,所以我需要某种方法来重新初始化它。

这怎么可能呢?我需要使用某种自定义类加载器吗?

该变量被初始化为 -

 静态最终 CountdownLatch 闩锁 = new CountdownLatch(1);

java unit-testing testing
7个回答
5
投票

当然,您可以通过反射或类加载来解决它,但是“如果我是您,我就不会在这里开始表单。”可变静态确实是邪恶的(即使是那些称为单例的)。因此,通过“从上面参数化”更好地设计代码 - 将对象传递给需要它们的人,而不是做一些硬连线或使用目录服务。


3
投票
自 JDK 1.5 以来,您

可以通过反射更改静态final。 (有关代码示例,请参阅此链接)...但我建议您不要这样做。事实上,过去已经表明,如果可能的话,应该避免静态变量。 Commons Logging 就是一个很好的例子。 (查看解释这里)。

因此,如果可能的话,摆脱

final 甚至 static。如果这不是选项,您可以编写一个通过反射来完成此操作的辅助函数。但这肯定是最糟糕的选择。


2
投票
假设您使用 junit 和 ant,这是一种(不是很有效)的方法。

您可以为每个测试方法创建一个单独的类,然后使用

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 开始


1
投票
首先如何初始化静态最终变量?

也许你可以模拟初始化变量的方法?

示例:static Final int number = getNumber();

通过模拟 getNumber() 方法返回您想要的值,您可以控制“number”变量。


0
投票
我认为通过单元测试或其他方式修改“最终”变量的唯一方法是通过字节码操作。


0
投票
编辑注释以明确指出所讨论的变量是静态的,因此在 JVM 中只存在一次。

标记为

final的变量仅被修改一次,这似乎在您的不同测试中发生一次。 如果您使用 JUnit,为什么不在每次调用 setup() 时创建该类的新实例,setup() 本身会在每次测试之前调用。 这将是最快、最能代表您情况的方法。


0
投票
静态决赛是常量,这意味着它们是不可变的。为什么用不同的值来测试它们?

一个好的静态最终变量是保存有关环境的某种状态的变量。例如,您的操作系统的变量。你甚至不会在测试中改变它。这种情况你需要在不同的机器上(或者至少是虚拟机)进行测试。

但是您想用不同的值测试这个变量。所以看来这里的修饰符之一是错误的,静态的或最终的,其中之一与你在这里需要的语义不匹配,否则你不会想用不同的值来测试它。

您能提供有关该问题的更多详细信息吗?

© www.soinside.com 2019 - 2024. All rights reserved.