TestNG
を介してant
テストを実行しようとすると、Java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset
が発生します(完全な例外については以下を参照してください)
Webアプリケーションのコンパイルや実行に問題はありませんが、antを介してテストを実行できません。これはクラスの読み込みの問題であると確信していますが、実行時にクラスの読み込みを実行する順序がわかりません。 Spring4.3.1とSpringSecurity4.1.1を使用しています。
org.springframework.http.MediaType
の「正しい」バージョンが使用されるようにjarをロードする特定の順序はありますか?
[testng] org.testng.TestNGException:
[testng] An error occurred while instantiating class com.avada.rest.api.GroupsIntTest: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset;
[testng] at org.testng.internal.ClassHelper.createInstance1(ClassHelper.Java:388)
[testng] at org.testng.internal.ClassHelper.createInstance(ClassHelper.Java:290)
[testng] at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.Java:125)
[testng] at org.testng.internal.ClassImpl.getInstances(ClassImpl.Java:191)
[testng] at org.testng.TestClass.getInstances(TestClass.Java:104)
[testng] at org.testng.TestClass.initTestClassesAndInstances(TestClass.Java:90)
[testng] at org.testng.TestClass.init(TestClass.Java:82)
[testng] at org.testng.TestClass.<init>(TestClass.Java:45)
[testng] at org.testng.TestRunner.initMethods(TestRunner.Java:409)
[testng] at org.testng.TestRunner.init(TestRunner.Java:247)
[testng] at org.testng.TestRunner.init(TestRunner.Java:217)
[testng] at org.testng.TestRunner.<init>(TestRunner.Java:161)
[testng] at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.Java:555)
[testng] at org.testng.SuiteRunner.init(SuiteRunner.Java:168)
[testng] at org.testng.SuiteRunner.<init>(SuiteRunner.Java:117)
[testng] at org.testng.TestNG.createSuiteRunner(TestNG.Java:1359)
[testng] at org.testng.TestNG.createSuiteRunners(TestNG.Java:1346)
[testng] at org.testng.TestNG.runSuitesLocally(TestNG.Java:1200)
[testng] at org.testng.TestNG.runSuites(TestNG.Java:1124)
[testng] at org.testng.TestNG.run(TestNG.Java:1096)
[testng] at org.testng.TestNG.privateMain(TestNG.Java:1425)
[testng] at org.testng.TestNG.main(TestNG.Java:1394)
[testng] Caused by: Java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharset()Ljava/nio/charset/Charset;
[testng] at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.getSupportedMediaTypes(RestTemplate.Java:757)
[testng] at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.Java:733)
[testng] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.Java:617)
[testng] at org.springframework.web.client.RestTemplate.execute(RestTemplate.Java:580)
[testng] at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.Java:287)
[testng] at com.avada.rest.api.ApiTestClient.getAll(ApiTestClient.Java:81)
[testng] at com.avada.rest.api.GroupsIntTest.<clinit>(GroupsIntTest.Java:17)
[testng] at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[testng] at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)
[testng] at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
[testng] at Java.lang.reflect.Constructor.newInstance(Constructor.Java:526)
[testng] at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.Java:29)
[testng] at org.testng.internal.ClassHelper.createInstance1(ClassHelper.Java:377)
[testng] ... 21 more
[testng] The tests failed.
信じられない...クラスの読み込みの問題に再び失敗しました...activemq-minimal-5.13.3.jar
という名前のuberjarには、競合の原因となっているspring
jarへの参照が含まれていました。 activemq-minimal-5.13.3.jar
はアルファベット順にspring
の前にあるため、そのactivemq
jar内のクラスはspring
jarを介してロード/使用されていました。最初にspring
クラスをロードするようにAntビルドを更新しました。これで、すべての設定が完了しました。
私が見つけた方法は、すべてのサードパーティライブラリを「テスト」プロジェクトにまとめ、クラスの読み込みの問題がどこにあるかを特定できるまで、jarを追加/削除しました(問題があった場所に多少の傾向があります)。
org.springframework.http.MediaType.getCharset()
は、4.3以降に導入されました。Javaが見つからなかった場合、ロードされて使用されるクラスパスに4.3.1未満のSpring-Coreバージョンがあることを意味します。
春の最新バージョンでは、彼らは変更しました
org.springframework.http;
MediaType contentType = headers.getContentType();
古い:
contentType.getCharSet()
新規:
contentType.getCharset()