- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试测试实用程序方法,该方法检查特定类是否在类路径上,如果是,则 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/
这些是否完全相同: ClassLoader.getSystemClassLoader() // 1 对比: obj.getClass().getClassLoader().getSystemClass
以下代码将 jar 文件添加到构建路径,它在 Java 8 中运行良好。但是,它在 Java 9 中抛出异常,该异常与对 URLClassLoader 的转换有关。任何想法如何解决这个问题?最佳解决方
通过 google 我确实找不到如何使用 Thread.getContextClassLoader() 的示例, 也许这个问题重复如下 Difference between thread's cont
我有一个 Web 应用程序,我的要求是读取一些文件并对其进行处理,并在应用程序启动时将文件内容保存在数据库中。 class MyUtil{ /** *Read the files */ public
我正在尝试测试实用程序方法,该方法检查特定类是否在类路径上,如果是,则 return true 否则 return false。 我为什么这样做:我必须独立类扩展同一个类,并且只有其中一个在类路径上。
我有一个 Web 应用程序,我的要求是读取一些文件并对其进行处理,并在应用程序启动时将文件内容保存在数据库中。 class MyUtil{ /** *Read the files */ public
我的项目目录结构(在 Eclipse 中): MyProject/ src/main/Java src/main/resources stories
我是一名优秀的程序员,十分优秀!