web-dev-qa-db-ja.com

Spring Boot Test MalformedURLException:不明なプロトコル:クラスパス

_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_をコピーして、リソースの不足が原因でエラーが発生するかどうかをテストしようとしましたが、成功しませんでした。

8
Evgeni Dimitrov

最短で最も簡単な方法は、テストを実行する前に単純なメソッドを作成することです。これは、「クラスパス」プロトコルのハンドラーを作成して登録することです。

    @BeforeClass
    public static void init() {
        org.Apache.catalina.webresources.TomcatURLStreamHandlerFactory.getInstance();
    }

確認したところ、正常に動作しています。このアプローチは、Spring-Bootアプリケーションの内部でも使用します

10
borino

問題は、プロトコルを処理しているクラスがorg.Apache.catalina.webresources.TomcatURLStreamHandlerFactoryであるということです。あなたはこれであなたのテストを修正することができます:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MalformedUrlApplicationTests {

    @Test
    public void contextLoads() {
    }

}

しかし、@ borinoの答えの方が良いと思います。

1
ahvargas

私は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ユニットテスト? に読み込む方法

0
karans123

ResourceLoaderを自動配線し、resourceLoader.getResource( "classpath:/test.json")を使用してファイルをロードすると、リソースフォルダーからファイルがロードされると思います。

0
Hany Sakr

Springには、"classpath:"プロトコルのURLを処理できるURLStreamHandlerがありません。 SpringはこのプロトコルをResourceLoaderAPIで処理します。リソースをロードすると、そのURLを取得できます。

ただし、Javaは、非標準プロトコルをサポートするためのメカニズムを提供します。あなたの質問に答える必要があるStackOverflowエントリを見つけました。

クラスパスURLのサポート

0
Bradley M Handy