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
相关产品推荐
相关产品推荐

