AndroidTest中如何获取文件路径?两种尝试方法均无效
在AndroidTest中正确获取测试文件路径的方法
我来帮你搞定这个问题!你之前尝试的两种方法都没法生效,主要是因为Android测试环境的资源加载逻辑和普通Java项目不一样,咱们来拆解下原因,再给你靠谱的解决方案:
为什么之前的方法行不通?
- 第一种方法:
getClass().getClassLoader().getResource()这套逻辑是普通Java项目的资源加载方式,但Android的资源是打包进APK的,不是文件系统里的独立文件,所以getFile()拿到的路径其实是APK内部的虚拟路径,根本没法用File类直接访问。 - 第二种方法:硬编码相对路径完全不靠谱,测试运行时的工作目录和你的项目根目录完全不沾边,不同设备、模拟器的路径也不一样,肯定找不到文件。
正确的解决方案
AndroidTest中的测试资源会被打包到测试APK里,我们没法直接拿到它的文件路径,但可以通过测试上下文获取资源的输入流,再把它复制到一个临时文件,这样就能拿到可正常访问的文件路径了。
步骤1:确认测试资源的存放目录
先把你的aa.pdf放到正确的测试资源目录:
- 选项1:创建
androidTest/assets目录,把aa.pdf放进去(推荐这种方式,适合任意格式的文件)。 - 选项2:创建
androidTest/res/raw目录,把aa.pdf放进去(注意文件名要全小写,不能有特殊字符)。
步骤2:编写代码获取临时文件路径
下面是完整的Instrumented Test代码示例:
import android.content.Context; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) public class PdfFileTest { // 获取测试PDF的临时文件 private File getTestPdf() throws IOException { // 获取测试APK的上下文(不是应用的上下文!) Context testContext = InstrumentationRegistry.getInstrumentation().getContext(); InputStream inputStream; // 根据你存放文件的目录选择对应的方式 // 如果放在androidTest/assets下: inputStream = testContext.getAssets().open("aa.pdf"); // 如果放在androidTest/res/raw下: // inputStream = testContext.getResources().openRawResource(R.raw.aa); // 创建临时文件,放在应用缓存目录,测试结束后自动删除 File tempPdf = File.createTempFile("temp_test_pdf", ".pdf", testContext.getCacheDir()); tempPdf.deleteOnExit(); // 将资源流写入临时文件 try (FileOutputStream outputStream = new FileOutputStream(tempPdf)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } finally { inputStream.close(); } return tempPdf; } @Test public void testPdfFileAccess() throws IOException { File pdfFile = getTestPdf(); String filePath = pdfFile.getAbsolutePath(); // 验证文件存在,后续就可以用这个路径做测试了 assertTrue("测试PDF文件不存在", pdfFile.exists()); // 这里添加你的测试逻辑,比如解析PDF等 } }
关键说明
- 必须用
InstrumentationRegistry.getInstrumentation().getContext()获取测试上下文,这样才能访问androidTest目录下的资源,而不是应用本身的资源。 - 为什么要复制到临时文件?因为APK里的资源是压缩存储的,没有直接的文件系统路径,只能通过输入流读取,复制到临时文件后才能拿到可用的文件路径供测试使用。
deleteOnExit()能确保临时文件在测试结束后自动被清理,不会占用设备存储空间。
内容的提问来源于stack exchange,提问作者JDChi
相关产品推荐
相关产品推荐

