在 Java 中模拟静态块
我对Java的座右铭是“仅仅因为Java有静态块,并不意味着你应该使用它们。撇开玩笑不谈,Java中有很多技巧使测试成为一场噩梦。我最讨厌的两个是匿名类和静态块。我们有很多使用静态块的旧代码,这些是我们编写单元测试的烦人点之一。我们的目标是能够以最少的代码更改为依赖于此静态初始化的类编写单元测试。
到目前为止,我对同事的建议是将静态块的主体移动到私有静态方法中并调用它。然后可以从静态块中调用此方法。对于单元测试,另一个依赖于这个类的类可以很容易地用JMockit来模拟不做任何事情。让我们在示例中看到这一点。staticInit
staticInit
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的解决方案,你认为会更干净?