カスタムClassLoaderを単体テストする方法は?


8

いくつかの理由で、私は子供優先ClassLoaderです。そのようなClassLoaderものはJDKには存在しないので、私はそれを書いています。これは私のユースケースの主要なコンポーネントであるため、徹底的にテストしてほしい。動作を壊さずに変更されないようにするために、私は非常に徹底して、テスト可能なすべてのものを自動的にテストしたいと考えています。

どうすればテストできますか?基本的な単体テストを行うにはどうすればよいですか?(特にsuper各メソッドに少なくとも1つの呼び出しがあるため)どこから始めればよいかわからず、開始するためのガイドラインを探しています。

私の主なアイデアは次のとおりです。何か問題がありますか?

/src/main/resources/parent.jar
                    child.jar

ファイルparent.jarcom.example.Exampleは、基本的なSupplier戻り値であるクラスが含まれています"parent"。ファイルchild.jarcom.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);
  }
}

1
はい、あなたは正しい考えを持っています。(1)「X」という名前のクラスについて、適切なクラスローダーによってXを解決すること、および(2)クラスローダーがフルフィルできない要求を委任することを検証する必要があります。
kdgregory 2016

(そしてこの質問はおそらくPSEよりもSOに適しています)
kdgregory

1
SOでは、この質問が適切なテストについて意見求めるようなものであるため、この質問がトピックから外れることを恐れていました。
OlivierGrégoire2016

はい、私たちは時々質問を投稿することを恐れるようにさせられて悲しいです。
djangofan 2017年

回答:


2

どうすればテストできますか?基本的な単体テストを行うにはどうすればよいですか?(特に各メソッドに少なくとも1つのスーパーコールがあるため)どこから始めればよいかわからず、開始するためのガイドラインを探しています。

もちろん、ClassLoadersやJavaについてはあまり知りませんが、これを単体テストするのは難しいでしょう。理由の1つは、あなたが述べたように、クラスがから継承されていることURLClassLoaderです。どういうわけかスーパークラスをモックアウトできたとしても、私の実装が意図したとおりに機能することを確認するテストにはあまり信頼できません。

だから、それだけの価値があるので、私はここでより統合されたテストを作成することに頼ります。

  • 備品
    • CanSuccessfullyLoad
      • parent.jar
      • child.jar
    • ThrowsAnErrorOnLoad
      • justparent.jar

その結果、各ケースのテストを記述し、期待どおりにロードまたはロードに失敗したことを確認するために、親/子クラスを非常に単純な方法で「使用」しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.