You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统Robolectric测试无法运行的路径编码问题求助

解决Windows下Robolectric测试路径空格被编码为%20的问题

报错信息

java.lang.AssertionError: Unable to load Robolectric native runtime library
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.ensureLoaded(DefaultNativeRuntimeLoader.java:234)
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.injectAndLoad(DefaultNativeRuntimeLoader.java:157)
    at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:149)
    at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:309)
    at org.robolectric.internal.SandboxTestRunner.executeInSandbox(SandboxTestRunner.java:489)
    at org.robolectric.internal.SandboxTestRunner.access$900(SandboxTestRunner.java:67)
    at org.robolectric.internal.SandboxTestRunner$7.evaluate(SandboxTestRunner.java:442)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.robolectric.internal.SandboxTestRunner.access$600(SandboxTestRunner.java:67)
    at org.robolectric.internal.SandboxTestRunner$6.evaluate(SandboxTestRunner.java:333)
    at org.robolectric.internal.SandboxTestRunner$3.evaluate(SandboxTestRunner.java:233)
    at org.robolectric.internal.SandboxTestRunner$5.lambda$evaluate$0(SandboxTestRunner.java:317)
    at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:101)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.nio.file.NoSuchFileException: C:\Users\Gabriel%20Sechan\.m2\repository\org\robolectric\android-all-instrumented\16-robolectric-13921718-i7\android-all-instrumented-16-robolectric-13921718-i7.jar
    at java.base/sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(Unknown Source)
    at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(Unknown Source)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(Unknown Source)
    at java.base/java.nio.file.Files.readAttributes(Unknown Source)
    at java.base/java.util.zip.ZipFile$Source.get(Unknown Source)
    at java.base/java.util.zip.ZipFile$CleanableResource.<init>(Unknown Source)
    at java.base/java.util.zip.ZipFile.<init>(Unknown Source)
    at java.base/java.util.zip.ZipFile.<init>(Unknown Source)
    at java.base/java.util.jar.JarFile.<init>(Unknown Source)
    at java.base/java.util.jar.JarFile.<init>(Unknown Source)
    at java.base/java.util.jar.JarFile.<init>(Unknown Source)
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.getResourcesInAndroidAll(DefaultNativeRuntimeLoader.java:245)
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.maybeCopyIcuData(DefaultNativeRuntimeLoader.java:267)
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.lambda$ensureLoaded$0(DefaultNativeRuntimeLoader.java:206)
    at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:83)
    at org.robolectric.nativeruntime.DefaultNativeRuntimeLoader.ensureLoaded(DefaultNativeRuntimeLoader.java:197)
    ... 18 more

问题原因

Robolectric在Windows环境下处理含空格的文件路径时,错误地将空格URL编码为%20,但实际文件路径中是原始空格,导致程序找不到已存在的文件。

解决方案

1. 升级Robolectric到最新稳定版

这个路径编码问题是Robolectric的已知bug,在4.10及以上版本已被修复。直接升级依赖即可:

  • Gradle项目:修改build.gradle中的依赖版本
    testImplementation 'org.robolectric:robolectric:4.12.1' // 替换为最新稳定版
    
  • Maven项目:修改pom.xml中的依赖版本
    <dependency>
        <groupId>org.robolectric</groupId>
        <artifactId>robolectric</artifactId>
        <version>4.12.1</version>
        <scope>test</scope>
    </dependency>
    

2. 迁移Maven仓库到无空格路径

如果暂时无法升级Robolectric,可以将本地Maven仓库迁移到没有空格的目录:

  • 找到Maven的settings.xml文件(默认在C:\Users\你的用户名\.m2下)
  • 修改localRepository节点为无空格路径,比如:
    <localRepository>C:\maven_repository</localRepository>
    
  • 把原.m2\repository下的所有文件复制到新路径

3. 指定Robolectric缓存目录为无空格路径

通过配置系统属性,让Robolectric使用无空格的缓存目录,避免路径编码问题:

  • Gradle项目:在build.gradle中添加配置
    test {
        systemProperty 'robolectric.dirs.cache', 'C:\robolectric_cache'
    }
    
  • 或者在测试类上添加注解:
    @RobolectricTestProperties(cacheDir = "C:\\robolectric_cache")
    public class YourTestClass {
        // 测试代码
    }
    

内容的提问来源于stack exchange,提问作者Gabe Sechan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:24:52