Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行)_Java_Unit Testing_Static Methods - Fatal编程技术网

Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行)

Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行),java,unit-testing,static-methods,Java,Unit Testing,Static Methods,我有一个基于机器id和计数器创建唯一id的静态方法。这是一个非常重要的问题(没有详细说明实际算法): 在生产环境中,这将很好,因为每个节点都不会并发执行此方法。然而,我想编写一个单元测试,它启动多个线程,以测试所有生成的ID是否满足它们的需求 很明显,现在的问题是静态方法,它非常适合使用,但无法以这种方式进行测试,因为测试只在一台机器上执行,并且计数器在线程之间共享 有没有办法欺骗运行时,使其在单元测试中允许静态方法的多个实例?每个运行时类都有静态字段。通过为每个要模拟的“机器”使用专用的类加载

我有一个基于机器id和计数器创建唯一id的静态方法。这是一个非常重要的问题(没有详细说明实际算法):

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

很明显,现在的问题是静态方法,它非常适合使用,但无法以这种方式进行测试,因为测试只在一台机器上执行,并且计数器在线程之间共享


有没有办法欺骗运行时,使其在单元测试中允许静态方法的多个实例?

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


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

为什么不将其更改为实例方法,使
生成器
成为单例(如果必须这样做)在生产环境中,同时在测试中创建多个实例?我不喜欢在测试中工作与实际使用时不同的东西。非常感谢,这是你问自己“为什么我实际上没有想到这个…”的答案之一。该链接非常有用,以防有人试图做类似的事情:@meriton。假设我使用的是多线程概念,具有单个JVM,静态方法上的多个请求可以并行运行还是自动同步?
public class Generator {
  static int counter = 0;
  static synchronized String generate(int machineId) {
    return generateID(counter++, machineId);
  } 
}