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

时间:2008-11-14 10:24:24

标签: java unit-testing testing

我正在为一个类编写单元测试,它有一个静态的最终变量。 但是,由于在每次测试中修改了静态最终var的状态,我需要一些方法来重新初始化它。

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

该变量初始化为 -

 static final CountdownLatch latch = new CountdownLatch(1);

7 个答案:

答案 0 :(得分:5)

当然你可以用反射或类加载来破解它,但“如果我是你,我不会在这里开始形式。”可变静力学真的很邪恶(甚至那些叫做单身人士)。因此,通过“从上面进行参数化”来设计更好的代码 - 将对象传递给需要它们的对象,而不是做一些硬连线或使用目录服务。

答案 1 :(得分:3)

可以通过反射改变自JDK 1.5以来的静态决赛。 (有关代码示例,请参阅this link)...但我建议您不要这样做。实际上,过去已经表明应尽可能避免使用静态变量。 Commons Logging就是一个很好的例子。 (查看解释here)。

因此,如果可能的话,摆脱 final 甚至 static 。如果这不是选项,你可以编写一个通过反射来完成它的辅助函数。但这肯定是最糟糕的选择。

答案 2 :(得分:2)

假设您正在使用junit和ant,那就是一种(效率不高)的方法。

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

正如Ant junit task documentation所述:

  

如果要分叉某些测试,请控制创建的Java虚拟机数量。可能的值是“perTest”(默认值),“perBatch”和“once”。 “once”只为所有测试创建一个Java VM,而“perTest”为每个TestCase类创建一个新VM。 “perBatch”为每个嵌套的< batchtest>创建一个VM。和一个收集所有嵌套< test> s。请注意,只有使用filtertrace,haltonerror,haltonfailure,errorproperty和failureproperty的相同设置的测试才能共享VM,因此即使将forofode设置为“once”,Ant也可能必须创建多个Java VM。对于未分叉到新Java VM的测试,将忽略此属性。自从Ant 1.6.2

答案 3 :(得分:1)

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

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

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

通过模拟getNumber() - 返回所需值的方法,您可以控制'number'变量。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

编辑注释以明确指出有问题的变量是静态的,因此在JVM中存在一次。

标记为最终的变量只会被修改一次,这似乎在您的不同测试中会发生一次。如果你正在使用JUnit,为什么不在每次调用setup()时创建一个新的类实例,在每次测试之前调用它本身。这将是您最快,最具代表性的情况。

答案 6 :(得分:0)

静态韵母是常量,这意味着它们不可变。为什么用不同的值测试它们?

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

但是你想用不同的值测试这个变量。因此,似乎其中一个修饰符在这里是错误的,静态或最终的,其中一个不符合您需要的语义,否则您不希望使用不同的值来测试它。

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