Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行)
我有一个基于机器id和计数器创建唯一id的静态方法。这是一个非常重要的问题(没有详细说明实际算法): 在生产环境中,这将很好,因为每个节点都不会并发执行此方法。然而,我想编写一个单元测试,它启动多个线程,以测试所有生成的ID是否满足它们的需求 很明显,现在的问题是静态方法,它非常适合使用,但无法以这种方式进行测试,因为测试只在一台机器上执行,并且计数器在线程之间共享Java:静态方法的单元测试并行执行(将在生产中的多个实例上运行),java,unit-testing,static-methods,Java,Unit Testing,Static Methods,我有一个基于机器id和计数器创建唯一id的静态方法。这是一个非常重要的问题(没有详细说明实际算法): 在生产环境中,这将很好,因为每个节点都不会并发执行此方法。然而,我想编写一个单元测试,它启动多个线程,以测试所有生成的ID是否满足它们的需求 很明显,现在的问题是静态方法,它非常适合使用,但无法以这种方式进行测试,因为测试只在一台机器上执行,并且计数器在线程之间共享 有没有办法欺骗运行时,使其在单元测试中允许静态方法的多个实例?每个运行时类都有静态字段。通过为每个要模拟的“机器”使用专用的类加载
有没有办法欺骗运行时,使其在单元测试中允许静态方法的多个实例?每个运行时类都有静态字段。通过为每个要模拟的“机器”使用专用的类加载器,您可以为每个“机器”提供专用的运行时类,从而为每个“机器”生成一个静态字段
设置这些类加载器需要知道类文件(或JAR文件)在本地文件系统中的位置,这可能很容易确定,也可能不容易确定,这取决于所讨论的类通常从何处加载。为什么不将其更改为实例方法,使
生成器成为单例(如果必须这样做)在生产环境中,同时在测试中创建多个实例?我不喜欢在测试中工作与实际使用时不同的东西。非常感谢,这是你问自己“为什么我实际上没有想到这个…”的答案之一。该链接非常有用,以防有人试图做类似的事情:@meriton。假设我使用的是多线程概念,具有单个JVM,静态方法上的多个请求可以并行运行还是自动同步?
public class Generator {
static int counter = 0;
static synchronized String generate(int machineId) {
return generateID(counter++, machineId);
}
}