首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试创建了.class文件?

如何测试创建了.class文件?
EN

Stack Overflow用户
提问于 2009-11-15 20:28:41
回答 2查看 2.3K关注 0票数 2

我想要对我的代码进行单元测试,它必须创建一个.java文件,编译它,然后创建相应的.class文件。

如何创建测试以查看是否创建了".class“文件?我已经为它的存在添加了test,现在我正在尝试测试这个文件是一个有效的类文件。

我试过了

代码语言:javascript
复制
 try  {
      Class.forName("Hello");
      throw AssertError();
 } catch( ClassNotFoundException e ) {
 }

 program.createClass();
 Class.forName("Hello");

但我不知道如何动态地将创建文件的路径添加到类路径。

编辑

加载的URL类完成了这项工作。

我现在的测试是这样的。

代码语言:javascript
复制
@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");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-15 20:31:34

使用URLClassLoader的新实例,指向创建目标类文件的根文件夹。然后,使用Class.forName(String,ClassLoader);方法和动态创建的URLClassLoader加载新类。

为了证明它有效,下面的测试用例将创建一个源文件,在其中编写一些Java代码,并使用Java6 ToolProvider接口对其进行编译。然后,它将使用URLClassLoader动态加载类,并调用对其类名的反射调用,以验证它确实是这个动态生成的类。

代码语言:javascript
复制
@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());
}
票数 4
EN

Stack Overflow用户

发布于 2009-11-15 21:13:36

与加载类来验证类不同,您可以将类打包到像"file Hello.class“这样的命令中,查看它是否报告它是一个java类文件,或者甚至生成一个java的子进程来在测试JVM之外加载类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1738712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档