Fenriswolf 程式筆記

奮利斯狼的地盤,小綿羊勿入

搜尋某個目錄下的所有 classes

在寫 test cases 時通常會包含一個 AllTests 的 class 以便測試所有的 test cases
但是新增了一個 test case 勢必要回來改這個 suite() method,我希望可以做到動態找出某個 package 下的所有 classes 加到 suite 裡面

public static Test suite() {
    TestSuite suite = new TestSuite("Fenriswolf Tests");
    suite.addTestSuite(TestCase1.class);
    suite.addTestSuite(TestCase2.class);

    return suite;
}

ClassFinder 這個程式是用來找某個目錄下的 classes,不過目錄下其他類型的檔案並不會列出

public static Class[] getClasses(String packageName)
        throws ClassNotFoundException, IOException {
    ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();
    assert classLoader != null;
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = classLoader.getResources(path);
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        dirs.add(new File(resource.getFile()));
    }
    ArrayList<Class> classes = new ArrayList<Class>();
    for (File directory : dirs) {
        classes.addAll(findClasses(directory, packageName));
    }
    return classes.toArray(new Class[classes.size()]);
}

private static List<Class> findClasses(File directory, String packageName)
        throws ClassNotFoundException {
    List<Class> classes = new ArrayList<Class>();
    if (!directory.exists()) {
        return classes;
    }
    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file, packageName + "."
                    + file.getName()));
        } else if (file.getName().endsWith(".class")) {
            classes.add(Class.forName(packageName
                    + '.'
                    + file.getName().substring(0,
                            file.getName().length() - 6)));
        }
    }
    return classes;
}

有了這個好用的功能我的 AllTests 可以改寫如下

public static Test suite() {
    TestSuite suite= new TestSuite("Fenriswolf Tests");
    
    try {
        Class[] classes = ClassesFinder.getClasses("com.fw.test");
        for (Class c : classes) {
            suite.addTestSuite(c);
        }            
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    return suite;
}

 
 
執行環境
JDK 1.6.0_03
JUnit 4.4

程式下載
ClassesFinder.java

廣告

2012/03/19 - Posted by | Java SE |

仍無迴響。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

%d 位部落客按了讚: