_Java.net.URL
_がclasspath
プロトコルを使用してSpringBootアプリケーションで使用されている場合、SpringBootはURLStreamHandlerFactory
を登録するため、期待どおりに機能します。例えばnew URL("classpath: someFile.whatever")
。
ただし、このコードがJUnitテストとして実行されると、_Java.net.MalformedURLException: unknown protocol: classpath
_ exceptionがスローされます。
SpringコンテキストがJUnitテスト用に初期化されたときに、適切なURLStreamHandlerFactory
が登録されていないようです。
再現する手順:
1)Spring Boot Starterプロジェクトを作成します(例:スターターWebのみを使用)。
2)_test.json
_に_src/main/resources
_ファイルを追加します
3)次のBeanを追加します。
_@Component
public class MyComponent {
public MyComponent() throws MalformedURLException {
URL testJson = new URL("classpath: test.json");
System.out.println(testJson);
}
}
_
4)アプリをJavaアプリケーションは正常に動作します
5)デフォルトの「contextLoads」テストを実行します。
_@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringUrlTestApplicationTests {
@Test
public void contextLoads() {
}
}
_
_Java.net.MalformedURLException: unknown protocol: classpath
_ exceptionがスローされます。
JUnitテストでクラスパスリソースでURLを使用する適切な方法は何ですか?
実際のユースケースでは、サードパーティのライブラリからのものであるため、new URL("classpath: test.json")
を変更することはできません。
_test.json
_の_src/test/resources
_をコピーして、リソースの不足が原因でエラーが発生するかどうかをテストしようとしましたが、成功しませんでした。
最短で最も簡単な方法は、テストを実行する前に単純なメソッドを作成することです。これは、「クラスパス」プロトコルのハンドラーを作成して登録することです。
@BeforeClass
public static void init() {
org.Apache.catalina.webresources.TomcatURLStreamHandlerFactory.getInstance();
}
確認したところ、正常に動作しています。このアプローチは、Spring-Bootアプリケーションの内部でも使用します
問題は、プロトコルを処理しているクラスがorg.Apache.catalina.webresources.TomcatURLStreamHandlerFactory
であるということです。あなたはこれであなたのテストを修正することができます:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MalformedUrlApplicationTests {
@Test
public void contextLoads() {
}
}
しかし、@ borinoの答えの方が良いと思います。
私はApacheコモンズを使用して次の方法を好みます:
String url = IOUtils.toString(
this.getClass().getResourceAsStream("test.json"),"UTF-8"
);
URL testJson = new URL(url);
ファイルtest.json=> uはsrc/test/resourcesフォルダーに保持できます->ここからロードされます、mavenで動作します
これらのような他のメソッドはここで利用できます テキストファイルリソースをJavaユニットテスト? に読み込む方法
ResourceLoaderを自動配線し、resourceLoader.getResource( "classpath:/test.json")を使用してファイルをロードすると、リソースフォルダーからファイルがロードされると思います。
Springには、"classpath:"
プロトコルのURLを処理できるURLStreamHandler
がありません。 SpringはこのプロトコルをResourceLoader
APIで処理します。リソースをロードすると、そのURLを取得できます。
ただし、Javaは、非標準プロトコルをサポートするためのメカニズムを提供します。あなたの質問に答える必要があるStackOverflowエントリを見つけました。