【问题标题】:Java: Unit Test parallel execution of static methods (would run on multiple instances in production)Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行)
【发布时间】:2014-07-31 16:31:27
【问题描述】:

我有一个基于机器 ID 和计数器创建唯一 ID 的静态方法。这个基本原理看起来像这样(不涉及实际算法的细节):

public class Generator {
  static int counter = 0;
  static synchronized String generate(int machineId) {
    return generateID(counter++, machineId);
  } 
}

在生产中这很好,因为每个节点不会同时执行此方法。但是,我想编写一个启动多个线程的单元测试,以测试是否所有生成的 ID 都满足它们的要求。

显然现在的问题是静态方法,它非常好用,但阻止了以这种方式进行测试,因为测试仅在单台机器上执行,并且计数器在线程之间共享。

有什么方法可以欺骗运行时在一个单元测试中允许一个静态方法的多个实例?

【问题讨论】:

  • 你为什么不把它改成一个实例方法让Generator在生产中成为一个单例(如果必须的话),同时在你的测试中创建多个实例?
  • 我不喜欢在测试中与实际使用时不同的东西。

标签: java unit-testing static-methods


【解决方案1】:

每个运行时类都存在静态字段。通过为您要模拟的每台“机器”使用专用的类加载器,您可以为每台“机器”提供专用的运行时类,从而为每台“机器”生成一个静态字段。

设置这些类加载器需要知道类文件(或 JAR 文件)在本地文件系统中的位置,这可能很容易确定,也可能并不容易,具体取决于通常从哪里加载所讨论的类。

【讨论】:

  • 非常感谢,这是您质疑自己“为什么我实际上没有想到...”的答案之一。该链接非常有帮助,以防有人尝试做类似的事情:tutorials.jenkov.com/java-reflection/…
  • @meriton。假设我正在使用具有单个 JVM 的多线程概念,静态方法上的多个请求可以并行运行还是自动同步?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多