Vì một số lý do, tôi cần có con trước ClassLoader
. Điều ClassLoader
đó không tồn tại trong JDK, vì vậy tôi đang viết nó. Vì đây là thành phần chính trong trường hợp sử dụng của tôi, tôi muốn nó được thử nghiệm nhiều. Để đảm bảo nó không bị thay đổi mà không phá vỡ hành vi, tôi muốn cực kỳ kỹ lưỡng và tự động kiểm tra tất cả những gì có thể kiểm tra được.
Vì vậy, làm thế nào tôi có thể kiểm tra nó? Làm thế nào tôi nên làm bài kiểm tra đơn vị cơ bản của tôi? Tôi bị kẹt khi bắt đầu từ đâu (đặc biệt là vì có ít nhất một super
cuộc gọi trong mỗi phương thức) và tôi đang tìm một số hướng dẫn để bắt đầu.
Ý tưởng chính của tôi là như sau. Có điều gì sai với nó?
/src/main/resources/parent.jar
child.jar
Các tập tin parent.jar
có chứa một lớp com.example.Example
là một Supplier
trả về cơ bản "parent"
. Các tập tin child.jar
có chứa một lớp com.example.Example
là một Supplier
trả về cơ bản "child"
.
Tôi sẽ tạo một tiêu chuẩn URLClassLoader
cho parent.jar
và tôi sẽ sử dụng tùy chỉnh của mình ClassLoader
để tải child.jar
. Sau đó, tôi sẽ tải lớp com.example.Example
và kiểm tra xem nó thực sự trở lại "child"
thay vì "parent"
.
Các trường hợp kiểm tra phức tạp hơn được nghĩ đến, nhưng tôi chỉ cần một xác nhận để bắt đầu: điều này có đủ cho bài kiểm tra cơ bản không? Đây thực sự là những gì tôi nên kiểm tra trong bài kiểm tra đơn vị của tôi? Nếu không, là gì?
Tôi khá chắc chắn rằng mã không cần thiết cho việc này, nhưng trong trường hợp bạn tò mò hoặc bất cứ điều gì, đây là nó.
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);
}
}