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

问题描述 投票:0回答:15

实际上,我需要获得 API 调用的响应,因为我需要

Context

robolectric
15个回答
248
投票

更新。

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

Robolectric.application;

对于 3.x 版本:

RuntimeEnvironment.application;

对于 4.x 版本:

  • 添加到您的

    build.gradle
    文件:

    testImplementation 'androidx.test:core:1.0.0'
    
  • 检索上下文:

    ApplicationProvider.getApplicationContext()
    

27
投票

你可以使用

RuntimeEnvironment.application

21
投票

添加

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

并使用:

private val app = ApplicationProvider.getApplicationContext()

19
投票

使用这个:

Robolectric.application

8
投票

截至 2019 年最新的 Robolectric 4.3 `

ShadowApplication.getInstance()

` 和

机器人应用

两者均已贬值。所以我正在使用

Context context = RuntimeEnvironment.systemContext;

获取上下文。


7
投票

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

  1. 注释@RunWith(RobolectricTestRunner.class)
  2. RuntimeEnvironment.application.getApplicationContext()

3
投票

在某些情况下,您可能需要应用程序的上下文而不是 Robolectris 默认上下文。 例如,如果您想获取您的包名称。默认情况下,Robolectric 将返回您

org.robolectric.default
包名称。要获取您的真实包名称,请执行以下操作:

构建.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$ enter image description here enter image description here


2
投票

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

可以在 Volley-Marshmallow-Release 找到一个简单示例

在 NetworkImageViewTest.java 中

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

排球链接可用 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'
}


2
投票

这适用于 Robolectric 3.5.1:

ShadowApplication.getInstance().applicationContext


2
投票

自 7 月 21 日发布 4.0-alpha-3 起,他们删除了

ShadowApplication.getApplicationContext()
。对于任何用 RuntimeEnvironment.application.getApplicationContext()
 注释的测试,请坚持使用 
@RunWith(RobolectricTestRunner::class)

顺便说一句,他们的当前指南有一个使用以下方式获取字符串资源的示例:

final Context context = RuntimeEnvironment.application;

(请注意,

RuntimeEnvironment
ShadowApplication
的 javadocs 目前反映的是非 alpha 3.x 版本。)


2
投票

首先将以下内容添加到您的

build.gradle

testImplementation 'androidx.test:core:1.2.0'

然后使用:

ApplicationProvider.getApplicationContext() as Application


1
投票

使用

Robolectric.getShadowApplication()
比直接使用
Robolectric.application
更安全。


1
投票

就您而言,我认为您应该注意您实际测试的内容。有时遇到无法测试代码或看似无法测试的代码问题表明您的代码可能需要重构。

对于 API 调用响应,您可能不想测试 API 调用本身。可能没有必要测试是否可以从任何任意 Web 服务发送/接收信息,而是测试您的代码以预期的方式处理和处理您的响应。

在这种情况下,重构您要测试的代码可能会更好。将响应解析/处理分解到另一个接受简单

String
的类,并通过注入示例字符串响应来在该类上进行测试。

这或多或少遵循了

单一职责依赖倒置的思想(SOLID中的SD


0
投票
好的,所以我知道很多其他人之前说过这个答案,并且可能已经过时了

when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application); when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir()); sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE); sut = new BundleManagerImpl(mockApplication, processHtmlBundle, resultListener, sharedPref);
我得到了 null,因为 when() 部分是在 sut 初始化之后。这可能会对你们中的一些人有所帮助。 

我也有

@RunWith(CustomRobolectricTestRunner.class) @Config(constants = BuildConfig.class)
课程开始时

还有

when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
    

0
投票
在 Robolectric 4 中:

val context = RuntimeEnvironment.getApplication()
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.