Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何在测试执行期间从资产文件夹访问文件?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在单元测试执行期间如何从资产@L_696_0@夹访问@L_696_0@?我的项目是使用Gradle构建的,我使用Robolectric运行测试.毕业生似乎正在认识资产:

这是我如何努力阅读@L_696_0@:

public String readFileFromAssets(String fileName) throws IOException {
    InputStream stream = getClass().getClassLoader().getresourceAsStream("assets/" + fileName);
    Preconditions.checkNotNull(stream,"Stream is null");
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream,"UTF-8"));
    return IoUtils.toString(reader);
}

但是流始终为空.我尝试了许多不同的方法,即使用不同方法定义到@L_696_0@的路径.

提前非常感谢你.

解决方法

基本上你必须使用上下文来读取资产.您不能使用ClassLoader加载资源,因为它不在类路径中.我不知道你如何运行Robolectric测试用例.这是我@R_801_5313@d studio和gralde命令中如何实现的.

我在应用程序项目中添加了单独的应用程序单元测试模块来运行Robolectric测试用例.
通过正确的构建配置和定制的RobolectricTestRunner,以下测试用例将通过.

@Config
@RunWith(MyRobolectricTestRunner.class)
public class ReadAssetsTest {

    @Test
    public void test_ToReadAssetsFileInAndroidTESTContext() throws IOException {

        ShadowApplication application = Robolectric.getShadowApplication();
        Assert.assertNotNull(application);
        InputStream input = application.getAssets().open("b.xml");
        Assert.assertNotNull(input);
    }

}

APP-单元测试/的build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.14.1'
    }
}

apply plugin: 'java'
evaluationDependsOn(':app')

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

repositories {
    maven { url "$System.env.ANDROID_HOME/extras/android/m2repository" } // Fix 'com.android.support:*' package not found issue
    mavenLocal()
    mavenCentral()
    jcenter()
}

dependencies {
    TESTCompile 'junit:junit:4.8.2'
    TESTCompile('org.robolectric:robolectric:2.4') {
        exclude module: 'classworlds'
        exclude module: 'commons-logging'
        exclude module: 'httpclient'
        exclude module: 'maven-artifact'
        exclude module: 'maven-artifact-manager'
        exclude module: 'maven-error-diagnostics'
        exclude module: 'maven-model'
        exclude module: 'maven-project'
        exclude module: 'maven-setTings'
        exclude module: 'plexus-container-default'
        exclude module: 'plexus-interpolation'
        exclude module: 'plexus-utils'
        exclude module: 'wagon-file'
        exclude module: 'wagon-http-lightweight'
        exclude module: 'wagon-provider-api'
        exclude group: 'com.android.support',module: 'support-v4'
    }
    TESTCompile('com.squareup:fest-android:1.0.+') {
        exclude group: 'com.android.support',module: 'support-v4'
    }
    TESTCompile 'org.mockito:mockito-core:1.10.10'
    def appModule = project(':app')
    TESTCompile(appModulE) {
        exclude group: 'com.google.android'
        exclude module: 'dexmaker-mockito'
    }
    TESTCompile appModule.android.applicationVariants.toList().first().javaCompile.classpath
    TESTCompile appModule.android.applicationVariants.toList().first().javaCompile.outputs.files
    TESTCompile 'com.google.android:android:4.1.1.4'
    /* FIXME : prevent stub! error
        TESTCompile files(appModule.plugins.findPlugin("com.android.application").getBootClasspath())
        */
    compile project(':app')
}

添加自定义RobolectricTestRunner来调整@L_696_0@路径.
看资产的路径.

public class MyRobolectricTestRunner extends RobolectricTestRunner {

    private static final String APP_MODULE_NAME = "app";

    /**
     * Creates a runner to run {@code TESTClass}. Looks in your working directory for your AndroidManifest.xml file
     * and res directory by default. Use the {@link org.robolectric.Annotation.Config} Annotation to configure.
     *
     * @param TESTClass the test class to be run
     * @throws org.junit.runners.model.InitializationError if junit says so
     */
    public MyRobolectricTestRunner(Class<?> TESTClass) throws InitializationError {
        super(TESTClass);
        System.out.println("TESTClass="+TESTClass);
    }

    @Override
    protected AndroidManifest getAppManifest(Config config) {

        String userDir = System.getProperty("user.dir","./");
        File current = new File(userDir);
        String prefix;
        if (new File(current,APP_MODULE_Name).exists()) {
            System.out.println("Probably running on Androidstudio");
            prefix = "./" + APP_MODULE_NAME;
        }
        else if (new File(current.getParentFile(),APP_MODULE_Name).exists()) {
            System.out.println("Probably running on Console");
            prefix = "../" + APP_MODULE_NAME;
        }
        else {
            throw new IllegalStateException("Could not find app module,app module should be \"app\" directory in the project.");
        }
        System.setProperty("android.manifest",prefix + "/src/main/AndroidManifest.xml");
        System.setProperty("android.resources",prefix + "/src/main/res");
        System.setProperty("android.assets",prefix + "/src/androidTest/assets");

        return super.getAppManifest(config);
    }

}

我跟着这个博客来做.

http://blog.blundell-apps.com/android-gradle-app-with-robolectric-junit-tests/
http://blog.blundell-apps.com/how-to-run-robolectric-junit-tests-in-android-studio/

完整示例代码here

大佬总结

以上是大佬教程为你收集整理的android – 如何在测试执行期间从资产文件夹访问文件?全部内容,希望文章能够帮你解决android – 如何在测试执行期间从资产文件夹访问文件?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。