Untuk beberapa alasan, saya perlu anak-anak ClassLoader. Seperti ClassLoaderitu tidak ada di JDK, jadi saya menulisnya. Karena ini adalah komponen utama dari use case saya, saya ingin ini diuji berat. Untuk memastikan itu tidak berubah tanpa merusak perilaku, saya ingin menjadi sangat teliti dan menguji semua yang dapat diuji secara otomatis.
Jadi bagaimana saya bisa mengujinya? Bagaimana saya harus melakukan tes unit dasar saya? Saya agak bingung harus mulai dari mana (terutama karena setidaknya ada satu superpanggilan dalam setiap metode) dan saya sedang mencari beberapa panduan untuk memulai.
Ide utama saya adalah sebagai berikut. Apakah ada yang salah dengan itu?
/src/main/resources/parent.jar
child.jar
File parent.jarberisi kelas com.example.Exampleyang merupakan dasar Supplierpengembalian "parent". File child.jarberisi kelas com.example.Exampleyang merupakan dasar Supplierpengembalian "child".
Saya akan membuat standar URLClassLoaderuntuk parent.jar, dan saya akan menggunakan kebiasaan saya ClassLoaderuntuk memuat child.jar. Maka saya akan memuat kelas com.example.Exampledan memeriksa bahwa itu benar-benar kembali "child"bukan "parent".
Kasus uji yang lebih kompleks dipikirkan, tetapi saya hanya perlu konfirmasi untuk memulai: apakah ini cukup untuk tes dasar? Apakah ini benar-benar yang harus saya uji dalam unit test saya? Jika tidak, apa itu?
Saya cukup yakin kode ini tidak diperlukan untuk ini, tetapi jika Anda penasaran atau apa pun, ini dia.
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);
}
}