java - 如何从静态初始化块对逻辑进行单元测试?
问题描述
我的一个类中有一个私有静态最终列表,我通过静态初始化块对其进行初始化。
private static final List<String> list;
static {
list = //lambda expression
}
我该如何继续为这样的事情编写测试?这是一个永远不会改变的字符串列表。
解决方案
从单元测试的角度来看,静态是有问题的。这是 Spring 使用 Dependency Injection 的原因之一!
您可以做的最好的事情是编写一个单元测试来检查静态是否已初始化为预期状态。
你说:
这是一个永远不会改变的字符串列表。
这取决于您所说的从不:
您可以(几乎)永远不能保证某些事情永远不会改变。您可能需要更改代码以满足新要求。
如果您可以枚举预期值并将它们硬连接到单元测试的代码中,那么您就可以了。当然,如果您的代码发生变化,您可能需要更改单元测试。但这也没关系。
如果您正在测试的值可能取决于环境,或者取决于一些先前初始化的结果,那么您有一个大问题。根据 JLS,类初始化在 JVM 的生命周期中只能执行一次。
如果您处于这种情况,“解决方案”是:
- 完全摆脱静电;例如用 DI 替换它。
- 将其重组为可测试的;例如,使用可以测试的静态方法。
- 在不同的 JVM中多次运行整个测试套件,每个不同的初始化路径一次。
- 不要在单元测试中测试初始化。
推荐阅读
- c++ - 使用 VS 2017 的 _mm_extract_si64 API 调用中未处理的异常
- swift - 如何在 UITableViewCell 类中使用 tableView 属性
- java - 在 Dockerized Java Web 服务中启动新进程
- android - BroadcastReceiver 以随机延迟启动 Activity
- node.js - 无法将我的重定向逻辑结果获取到 node.js、express、mongodb Web 应用程序中的配置文件页面
- android - 如何在android中添加Firestore分页
- amazon-s3 - 如何从 S3 存储桶 AWS 中获取所有图像 URL 的转储?
- r - ggplot和R中的基本图有什么区别?
- generics - Kotlin 中的泛型:如何访问伴随对象
- swift - 如何将 Google 语音中的最终转录字符串返回到文本响应?