gpt4 book ai didi

java - 如何使用 JUnit 在 Maven 项目中通过自定义类加载器加载相同的类两次

转载 作者:行者123 更新时间:2023-12-01 04:33:40 25 4
gpt4 key购买 nike

我疯狂地进行了 stackoverflow 两个小时,但到目前为止没有任何帮助。

我有非常非常基本的 Maven 项目,其中有一些 Singleton 类。据说可以使用不同的类加载器加载单例两次,因此我编写了自己的类,但问题是我无法加载该类,因为我收到了 ClassNotFoundException 但我不知道为什么。

@RunWith(JUnit4.class)
public class SingletonClassLoadedDifferentClassLoadersTestCase {

static class SingletonClassLoader extends ClassLoader {

@Override
public Class<?> loadClass(String className)
throws ClassNotFoundException {
try {
InputStream is =
// seems to be the central problem
ClassLoader.getSystemResourceAsStream(className);
if (is == null) {
throw new ClassNotFoundException();
}

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[1024];

while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}

byte[] classBytes = buffer.toByteArray();

return defineClass(className, classBytes, 0, classBytes.length);
} catch (IOException ex) {
throw new ClassNotFoundException();
}
}
}

@Test
public void singletonTest() throws Exception {
Class<?> singleton1 = new SingletonClassLoader()
.loadClass("SingletonLazy");
Class<?> singleton2 = new SingletonClassLoader()
.loadClass("SingletonLazy");
}
}

SingletonLazy 只是 src/main/java 中的一个类(隐藏在某个包目录中)。看来 ClassLoader 无法找到该类,但为什么呢?我发现它不在 target/test-classes 中。当我进行测试时,如何告诉 Maven 以某种方式将该类放在类路径上的 src/main/java/some/package/SingletonLazy.java 中?我从命令行执行它,例如 mvn clean test

感谢您的任何提示!

最佳答案

不要使用SystemClassLoader。请改用直接类加载器。将您的代码更改为,

InputStream is = SingletonClassLoadedDifferentClassLoadersTestCase.class
.getClassLoader()
.getResourceAsStream(className);

我相信 JUnit 为每个测试创建一个单独的类加载器。我的印象是 JUnit 这样做是为了避免静态造成的问题。我尝试了一些测试,发现事实并非如此!即使您在 src/test/java 中定义了一个类它的静态状态不会被删除,即每次测试都不会重新加载类。

我尝试的第二件事是 fork 测试,但是 <forkMode>always</forkMode>我相信最高级别的 fork 仅适用于两个不同测试类中定义的测试。如果您在同一个类中定义了测试方法,则所有测试方法运行都将使用相同的 JVM 实例。

静态本质上是不好的,所以我建议使用控制反转(IOC)框架。我过去使用过 Guice,它非常轻量且高效。

关于java - 如何使用 JUnit 在 Maven 项目中通过自定义类加载器加载相同的类两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com