junit InstrumentationRegistry.getContext()的替换示例

ijxebb2r  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(125)

在AndroidX中,InstrumentationRegistry现在已被弃用。
此方法已弃用.在大多数情况下,应使用getApplicationContext(),而不应使用检测测试上下文.如果确实需要访问得测试上下文以访问其资源,建议改用getResourcesForApplication(String).
但是,我找不到任何示例来说明如何在测试中获取PackageManager的示例以调用getResourcesForApplication,以及应该为它的字符串参数提供哪个包名。
例如,下面是当前有效的代码:

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.io.InputStream;

import androidx.test.InstrumentationRegistry;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import static org.junit.Assert.*;

@RunWith(AndroidJUnit4.class)
public class MyTest {

    @Test
    public void processImage() {
        // load image from test assets
        AssetManager am = InstrumentationRegistry.getContext().getAssets();
        InputStream is = null;
        Bitmap image = null;
        try {
            is = am.open("image.jpg");
            image = BitmapFactory.decodeStream(is);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if ( is != null ) {
                try {
                    is.close();
                } catch (IOException ignored) { }
            }
        }

        assertNotNull(image);

        // do something with the image
    }
}

现在,如何在不使用过时的InstrumentationRegistry.getContext()的情况下重写此测试?请记住,image.jpg不是应用程序资产的一部分-它位于src/androidTest/assets文件夹中,并被打包到AppName-buildType-androidTest.apk中(它不存在于AppName-buildType.apk中,我知道其包名)。
如何推导测试APK的包名?有没有可能避免在我的单元测试中硬编码包名字符串?我正在寻找一个和原始代码一样优雅的解决方案,但不使用过时的方法。

0lvr5msh

0lvr5msh1#

我认为您应该使用InstrumentationRegistry.getInstrumentation().getContext().getAssets()而不是InstrumentationRegistry.getContext().getAssets()
它将使用您的测试上下文,因此您应该获得您的资产。

相关问题