18

ディレクトリを監視し、ディレクトリに変更があった場合にディレクトリ内のすべてのテストを実行するプログラムに取り組んでいます。

これには、キャッシュされたコピーを取得する代わりに、プログラムがクラスを動的にロードする必要があります。

テスト クラスを動的にロードできます。テストへの変更は実行時に検出され、使用されます。ただし、これは、テストによってテストされるクラスには当てはまりません。

クラスを動的にロードし、テスト クラスのリストを返すための私のコード:

List<Class<?>> classes = new ArrayList<Class<?>>();
    for (File file : classFiles) {
        String fullName = file.getPath();
        String name = fullName.substring(fullName.indexOf("bin")+4)
                .replace('/', '.')
                .replace('\\', '.'); 
        name = name.substring(0, name.length() - 6);

            tempClass = new DynamicClassLoader(Thread.currentThread().getContextClassLoader()).findClass(name)          } catch (ClassNotFoundException e1) {
            // TODO Decide how to handle exception
            e1.printStackTrace();
        }

        boolean cHasTestMethods = false;
        for(Method method: tempClass.getMethods()){
            if(method.isAnnotationPresent(Test.class)){
                cHasTestMethods = true;
                break;
            }
        }
        if (!Modifier.isAbstract(cachedClass.getModifiers()) && cHasTestMethods) {
            classes.add(tempClass);
        }
    }
    return classes;

ここで説明されているリローダーとしてのDynamicClassLoaderを使用して、インスタンス化時にJavaにクラスを強制的にリロードする方法は?

それを修正する方法はありますか?すべてのクラスが動的にロードされると思いました。ただし、DynamicClassLoader で loadclass を上書きしないことに注意してください。テスト クラスを実行すると init が返されるためです。

編集:これは機能しません。クラスはロードされますが、その中のテストは検出されません...

List<Request> requests = new ArrayList<Request>();
    for (File file : classFiles) {
        String fullName = file.getPath();
        String name = fullName.substring(fullName.indexOf("bin")+4)
                .replace('/', '.')
                .replace('\\', '.'); 
        name = name.substring(0, name.length() - 6);
        Class<?> cachedClass = null;
        Class<?> dynamicClass = null;
        try {
            cachedClass = Class.forName(name);


            URL[] urls={ cachedClass.getProtectionDomain().getCodeSource().getLocation() };
            ClassLoader delegateParent = cachedClass .getClassLoader().getParent();
            URLClassLoader cl = new URLClassLoader(urls, delegateParent) ;
            dynamicClass = cl.loadClass(name);
            System.out.println(dynamicClass);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

編集編集:次のようなテストメソッドを検出します:

            for(Method method: dynamicClass.getMethods()){
            if(method.isAnnotationPresent(Test.class)){
                requests.add(Request.method(dynamicClass, method.getName()));
            }
        }
4

1 に答える 1