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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:15:28