Untuk beberapa alasan, saya perlu anak-anak ClassLoader
. Seperti ClassLoader
itu 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 super
panggilan 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.jar
berisi kelas com.example.Example
yang merupakan dasar Supplier
pengembalian "parent"
. File child.jar
berisi kelas com.example.Example
yang merupakan dasar Supplier
pengembalian "child"
.
Saya akan membuat standar URLClassLoader
untuk parent.jar
, dan saya akan menggunakan kebiasaan saya ClassLoader
untuk memuat child.jar
. Maka saya akan memuat kelas com.example.Example
dan 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);
}
}