我怎么能测试一个.class文件的创建?
-
20-09-2019 - |
题
欲单元测试我的代码,这将需要创建一个.java文件编译它,然后得到相应的.class文件应该被创建。
如何创建测试,以查看是否创建“.class”的文件?我已经为它的存在已经加入的测试,现在我想测试该文件是一个有效的类文件。
我试图
try {
Class.forName("Hello");
throw AssertError();
} catch( ClassNotFoundException e ) {
}
program.createClass();
Class.forName("Hello");
但我真的不知道如何动态地添加这些文件被创建到类路径中的路径。
修改强>
加载URL类做的工作。
这是我的测试看起来像现在。
@Test
void testHello() throws MalformedURLException, ClassNotFoundException {
URL[] url = {
new URL("file:/home/oreyes/testwork/")
};
try {
new URLClassLoader(url).loadClass("Hello");
throw new AssertionError("Should've thrown ClassNotFoundException");
} catch ( ClassNotFoundException cnfe ){
}
c.process();
new URLClassLoader(url).loadClass("Hello");
}
解决方案
使用的URLClassLoader
的新实例,指向在其中创建目标类文件的根文件夹。然后,使用Class.forName(String,ClassLoader);
方法与动态创建URLClassLoader
加载新的类。
要表明,它的工作原理,以下测试案例将创建一个源文件中,有写一些Java代码和使用Java 6 ToolProvider接口编译它。然后,它会使用的URLClassLoader动态加载类,并调用它的类名的反射呼叫,以验证它的真正这个类已经在运行中产生的。
@Test
public void testUrlClassLoader() throws Exception {
Random random = new Random();
String newClassName = "Foo" + random.nextInt(1000);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
List<File> files = new ArrayList<File>();
File sourceFolder = new File(".");
File sourceFile = new File(sourceFolder, newClassName + ".java");
FileWriter fileWriter = new FileWriter(sourceFile);
fileWriter.write("public class " + newClassName + " { { System.out.println(\""
+ newClassName + " loaded\"); }}");
fileWriter.close();
files.add(sourceFile);
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager
.getJavaFileObjectsFromFiles(files);
compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
fileManager.close();
URL url = sourceFolder.toURI().toURL();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url });
Object newInstance = urlClassLoader.loadClass(newClassName).newInstance();
assertEquals(newClassName, newInstance.getClass().getName());
}
其他提示
相反,以验证其加载类的,你可以掏出来的命令,如“文件Hello.class”,看它是否报告说,它是一个Java类文件,甚至酿出的java的子进程加载测试JVM以外的类。
不隶属于 StackOverflow