如何在Robolectric中访问应用程序的上下文?

133

实际上,我需要获取 API 调用的响应,为此我需要 Context

14个回答

243

更新。

仅适用于 1.x 和 2.x 版本:

Robolectric.application;

对于版本3.x:

RuntimeEnvironment.application;

对于版本4.x:

  • 在你的build.gradle文件中添加:

testImplementation 'androidx.test:core:1.0.0'
  • 使用以下代码检索上下文:

    ApplicationProvider.getApplicationContext()
    

  • 12
    你的测试中是否加上了@RunWith(RobolectricTestRunner.class)? - Eugen Martynov
    4
    好的,我会尽力进行翻译。以下是需要翻译的内容:Yeah.. I added... but still it return null.是的,我添加了……但它仍然返回空值。 - user1667968
    1
    我已经按照你提到的所有步骤操作了,但仍然得到 null。还有其他可能遗漏的地方吗? - Moises Jimenez
    15
    请确保在静态代码中(如使用@BeforeClass注解的方法)不要使用RuntimeEnvironment.application,因为Robolectric可能在这时尚未初始化,该值将为null。请注意保持原意并简明扼要地表达。 - sfera
    1
    同时,这会导致应用程序在测试之间出现混乱,这可能是不可取的。 - Chris
    显示剩余10条评论

    27

    您可以使用

    RuntimeEnvironment.application
    

    4
    在RoboElectric 3.0中,Roboelectric.application不再存在,所以这可能是最好的答案。 - kenyee

    20
    添加
    testImplementation "androidx.test:core-ktx:${deps.testrunner}"
    

    并使用:

    private val app = ApplicationProvider.getApplicationContext()
    

    导入 androidx.test.core.app.ApplicationProvider - luckyhandler
    2
    val appContext = ApplicationProvider.getApplicationContext<Context>()
    应用上下文 = ApplicationProvider.getApplicationContext<Context>()
    - luckyhandler
    3
    这是最新的 Robolectric 的正确答案。这里提到的其他方法已经被弃用或删除。 - Gabor

    19

    使用这个:

    Robolectric.application
    

    8

    截至2019年,最新的Robolectric版本为4.3。

    ShadowApplicationProvider.getShadowApplication()

    RuntimeEnvironment.application

    都已经过时。因此我正在使用

    Context context = RuntimeEnvironment.systemContext;
    

    获取Context。


    6

    要获取应用程序上下文,您必须执行以下操作:

    1. 使用 @RunWith(RobolectricTestRunner.class) 进行注释
    2. RuntimeEnvironment.application.getApplicationContext()

    3
    在某些情况下,您可能需要使用应用程序的上下文而不是默认上下文。例如,如果您想获取包名,则默认情况下Robolectric将返回org.robolectric.default包名。要获取真实的包名,请执行以下操作:
    build.gradle testImplementation 'org.robolectric:robolectric:4.2.1' 您的测试类:
    @RunWith(RobolectricTestRunner.class)
    @Config( manifest="AndroidManifest.xml")
    public class FooTest {
    
    @Test
    public void fooTestWithPackageName(){
        Context context = ApplicationProvider.getApplicationContext();
        System.out.println("My Real Package Name: " + context.getPackageName());
    }
    
    }
    

    确保在您的运行/调试配置中,工作目录设置为:$MODULE_DIR$。 输入图像描述 输入图像描述


    2

    2

    首先在你的build.gradle中添加以下内容:

    testImplementation 'androidx.test:core:1.2.0'

    然后使用以下代码:

    ApplicationProvider.getApplicationContext() as Application

    将"Original Answer"翻译成"最初的回答"

    2

    同意@EugenMartynov和@rds的答案...

    在NetworkImageViewTest.java中可以找到一个快速的示例:Volley-Marshmallow-Release

    // mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

    Volley链接可在此处找到: https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release

    您需要在Android Studio的volley模块中添加依赖项:

    dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接