我对 Java 的座右铭是“仅仅因为 Java 有静态块,并不意味着你应该使用它们。” 撇开玩笑不谈,Java 中有很多技巧让测试成为一场噩梦。我最讨厌的两个是匿名类和静态块。我们有很多使用静态块的遗留代码,这些是我们推动编写单元测试的恼人点之一。我们的目标是能够以最少的代码更改为依赖此静态初始化的类编写单元测试。
到目前为止,我对同事的建议是将静态块的主体移动到私有静态方法中并调用它staticInit
。然后可以从静态块中调用此方法。对于依赖于这个类的另一个类的单元测试,可以很容易地staticInit
用JMockit模拟不做任何事情。让我们看看这个例子。
public class ClassWithStaticInit {
static {
System.out.println("static initializer.");
}
}
将改为
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
这样我们就可以在JUnit中执行以下操作。
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
然而,这种解决方案也有其自身的问题。您不能在同一个 JVM 上运行DependentClassTest
和运行,ClassWithStaticInitTest
因为您实际上希望静态块运行ClassWithStaticInitTest
.
完成这项任务的方法是什么?或者任何更好的、非基于 JMockit 的解决方案,您认为它们会更干净?