Spring Boot Test 格式错误的URL异常:未知协议:类路径

2022-09-04 20:03:03

如果在带有协议的 Spring Boot 应用程序中使用,则它按预期工作,因为 Spring Boot 注册 。例如.java.net.URLclasspathURLStreamHandlerFactorynew URL("classpath: someFile.whatever")

但是,当此代码作为 JUnit 执行时,将引发异常。java.net.MalformedURLException: unknown protocol: classpath

似乎在为 JUnit 测试初始化 Spring 上下文时,没有注册适当的。URLStreamHandlerFactory

重现步骤:

1)创建Spring Boot Starter项目(例如,仅使用Starter Web)。

2)添加文件test.jsonsrc/main/resources

3) 加入以下豆类:

@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将引发异常。

在 JUnit 测试中将 URL 与类路径资源一起使用的适当方法是什么?

在实际用例中,我无法更改,因为它来自第三方库。new URL("classpath: test.json")

已尝试复制 ,以测试错误是否可能由缺少资源引起 - 未成功。test.jsonsrc/test/resources


答案 1

最短和最简单的方法是在测试执行之前创建简单的方法,即为“类路径”协议创建和注册处理程序。

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

我刚刚检查过,它工作正常。这种方法也使用弹簧启动应用程序的内部


答案 2

问题是处理协议的类是 。你可以用这个来修复你的测试:org.apache.catalina.webresources.TomcatURLStreamHandlerFactory

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

    @Test
    public void contextLoads() {
    }

}

但我认为@borino答案更好。


推荐