gpt4 book ai didi

java - 使用 Powermockito 模拟 ClassLoader.getSystemClassLoader().loadClass

转载 作者:行者123 更新时间:2023-11-29 04:40:13 27 4
gpt4 key购买 nike

我正在尝试测试实用程序方法,该方法检查特定类是否在类路径上,如果是,则 return true 否则 return false

我为什么这样做:我必须独立类扩展同一个类,并且只有其中一个在类路径上。如果一个特定的在类路径上,则需要做特定的事情。

使用下面的方法检查特定类是否在类路径上。此检查只会在第一次请求后进行一次。我也检查了 Class.forName() 但决定采用以下方法。

我的实用方法看起来像这样:

public static boolean isMyClassOnClassPath() {
try {
ClassLoader.getSystemClassLoader().loadClass("com.MyClass");
return true;
} catch (ClassNotFoundException ex) {
return false;
}

检查 false 条件很容易,因为特定类不是 ClassPath。当此方法返回 true 时,我正在尝试为积极的场景编写 Junit

@Test
public void isMyClassOnClassPathShouldReturnTrueWhenMyClassIsOnClassPath() throws Exception{
PowerMockito.mockStatic(MyClass.class);
ClassLoader classLoader = PowerMockito.mock(ClassLoader.class);
PowerMockito.mockStatic(ClassLoader.class);
PowerMockito.when(ClassLoader.getSystemClassLoader()).thenReturn(classLoader);

//trying to mock classLoader.loadClass, below way is incorrect
//PowerMockito.when(classLoader.loadClass("com.MyClass")).thenReturn(Class<java.lang.Object.class>);
Assert.assertTrue(MyClassUtil.isMyClassOnClassPath());
}

那么是否可以模拟 classLoader.loadClass() 方法?

最佳答案

老实说:别做那样的事情。

简而言之,您就像一个坐在树上的人,开始随机砍掉他所坐的树的枝条。含义:这是 JVM 的核心部分。假设您的模拟有效:那么该方法的每个调用者都会收到您的模拟加载器!因此,当您的测试用例本身想要加载一些类时,它会遇到您的模拟!

几乎和往常一样,当人们声称“我需要为 xyz 使用 Powermock”时,您真正的问题是另一个问题:您创建了无法测试的代码。通过在那里进行静态调用,您可以防止自己测试代码!

初学者可以看看here学习如何编写可测试的代码。但如果您对如何修复您的设计感到好奇:

class ClassPathChecker {
private final ClassLoader classLoader;
ClassPathChecker() { this(ClassLoader.getSystemClassLoader()); }
ClassPathChecker(ClassLoader classLoader) {
this.classLoader = this.classLoader);
}

boolean canClassBeLoaded(String className) {
try {
classLoader.loadClass ...

上面使用依赖注入(inject)来插入一个mocked ClassLoader;这使您可以完全 控制正在发生的一切。 完全不使用 Powermock。

并且出于好奇:为什么您将自己限制在系统类加载器中?像 Class.forName("yourclass") 这样的简单调用不会告诉您相同的信息吗?

关于java - 使用 Powermockito 模拟 ClassLoader.getSystemClassLoader().loadClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39510885/

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