首页 > 解决方案 > 如何从静态初始化块对逻辑进行单元测试?

问题描述

我的一个类中有一个私有静态最终列表,我通过静态初始化块对其进行初始化。

private static final List<String> list;

static {
    list = //lambda expression
}

我该如何继续为这样的事情编写测试?这是一个永远不会改变的字符串列表。

标签: javaspring

解决方案


从单元测试的角度来看,静态是有问题的。这是 Spring 使用 Dependency Injection 的原因之一!

您可以做的最好的事情是编写一个单元测试来检查静态是否已初始化为预期状态。

你说:

这是一个永远不会改变的字符串列表。

这取决于您所说的从不:

  • 您可以(几乎)永远不能保证某些事情永远不会改变。您可能需要更改代码以满足新要求。

  • 如果您可以枚举预期值并将它们硬连接到单元测试的代码中,那么您就可以了。当然,如果您的代码发生变化,您可能需要更改单元测试。但这也没关系。

  • 如果您正在测试的值可能取决于环境,或者取决于一些先前初始化的结果,那么您有一个大问题。根据 JLS,类初始化在 JVM 的生命周期中只能执行一次。

    如果您处于这种情况,“解决方案”是:

    • 完全摆脱静电;例如用 DI 替换它。
    • 将其重组为可测试的;例如,使用可以测试的静态方法。
    • 在不同的 JVM中多次运行整个测试套件,每个不同的初始化路径一次。
    • 不要在单元测试中测试初始化​​。

推荐阅读