いくつかの理由で、私は子供優先ClassLoader
です。そのようなClassLoader
ものはJDKには存在しないので、私はそれを書いています。これは私のユースケースの主要なコンポーネントであるため、徹底的にテストしてほしい。動作を壊さずに変更されないようにするために、私は非常に徹底して、テスト可能なすべてのものを自動的にテストしたいと考えています。
どうすればテストできますか?基本的な単体テストを行うにはどうすればよいですか?(特にsuper
各メソッドに少なくとも1つの呼び出しがあるため)どこから始めればよいかわからず、開始するためのガイドラインを探しています。
私の主なアイデアは次のとおりです。何か問題がありますか?
/src/main/resources/parent.jar
child.jar
ファイルparent.jar
にcom.example.Example
は、基本的なSupplier
戻り値であるクラスが含まれています"parent"
。ファイルchild.jar
にcom.example.Example
は、基本的なSupplier
戻り値であるクラスが含まれています"child"
。
の標準URLClassLoader
を作成しparent.jar
、カスタムClassLoader
を使用してをロードしますchild.jar
。それから私は、クラスをロードしたいcom.example.Example
と、それは実際に戻っていますことを確認してください"child"
代わりに"parent"
。
より複雑なテストケースが考えられますが、開始するには確認が必要です。これで基本的なテストはこれで十分ですか?これは本当に単体テストでテストする必要があるのですか?そうでない場合、何ですか?
これにはコードは必要ないと確信していますが、好奇心旺盛な方のために、こちらに示しておきます。
import java.io.*;
import java.net.*;
import java.util.*;
class ChildFirstClassLoader extends URLClassLoader {
ChildFirstClassLoader(ClassLoader parent) {
super(new URL[0], parent);
}
@Override
// Make this method available in this package.
protected void addURL(URL url) {
super.addURL(url);
}
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
c = findClass(name);
} catch (ClassNotFoundException ignore) {
c = super.loadClass(name, resolve);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
@Override
public URL getResource(String name) {
URL url = findResource(name);
if (url == null) {
url = super.getResource(name);
}
return url;
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
List<URL> urls = new ArrayList<>();
urls.addAll(Collections.list(findResources(name)));
urls.addAll(Collections.list(super.getResources(name)));
return Collections.enumeration(urls);
}
}