「WireMock」を使用してJUnitでの起動時に、「NoClassDefFoundError」の例外原因として「AuthenticationStrategy」が存在しない問題の原因、対処方法について紹介します。
概要
通信関連テストを実施するためテスト用サーバを簡易的に構築できる「WireMock」を使用したところ、起動時にクラスが存在しないことを示す「NoClassDefFoundError」の例外が発生しました。
例外内容を確認したところ「org/apache/http/client/AuthenticationStrategy」のクラスが存在しないようです。
「AuthenticationStrategy」は「Apache HttpClient」ライブラリに含まれているため、必要なライブラリを用意していた状態にも関わらず今回の問題が発生しました。
最終的には、今回は使用できないと判断しましたが、それらの原因について調査した内容を記載します。
環境
検証時の環境を記載します。
- junit:4.12
- wiremock:2.19.0
- httpclient:4.1.3(最終的には、このライブラリが原因で起動できません)
例外内容の確認
テスト実行時に以下に記載する例外が出力されました。
java.lang.NoClassDefFoundError: org/apache/http/client/AuthenticationStrategy at
com.github.tomakehurst.wiremock.http.ProxyResponseRenderer.(ProxyResponseRenderer.java:59)
例外内容を確認すると「java.lang.NoClassDefFoundError」の原因として「org/apache/http/client/AuthenticationStrategy」が出力されています。
「java.lang.NoClassDefFoundError」は、実行時にクラスが存在しない場合に出力される例外になります。
今回の場合は、「org/apache/http/client/AuthenticationStrategy」のクラスが存在していないと判断できます。
問題内容の検証
クラスが存在しないことは例外内容から判断できました。この問題が発生した場合の確認方法としては、以下の2つが考えられます。
- 実行時に「Apache HttpClient」のライブラリが参照できない。
- ライブラリが参照できているにも関わらず「AuthenticationStrategy」のクラスが存在しない。
「Apache HttpClient」のライブラリが参照できない
実行時のライブラリをまとめているディレクトリを確認したところ、「Apache HttpClient」のライブラリが存在していることを確認できました。
このため、今回はこちらの問題ではないと判断しました。
「AuthenticationStrategy」のクラスが存在しない
「Apache HttpClient」のjarを中身を確認することにしました。jarの中身はzipの拡張子に変更して解凍するなどの方法で確認できます。
中身を確認したところ該当のクラスが存在していないことを確認できました。
問題内容の考察
クラスが存在しないことを判断できました。ライブラリが存在しているにも関わらずクラスが存在しない。
このようなときは公式ページに記載されている「Javadoc」を確認します。何かしらのヒントがもらえることが多いです。
Since:4.2
残念ながらライブラリのバージョンが「4.2」以降に対応しているクラスとわかりました。今回は、使用していたライブラリが古いため存在しないクラスでした。
問題内容の対処方法
「Apache HttpClient」のライブラリをバージョンアップすることで起動できるようになります。
まとめ
今回の場合は、「Apache HttpClient」ライブラリが「4.1.3」となり、簡単に古いライブラリのバージョンを簡単に上げることができないプロジェクトのため、使用を見送ることにしました。
代替の方法として、概ね同じ機能がある 「MockServer」で代用できそうなのでそちらを使用するようにしました。