121

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

4

14 回答 14

234

更新。

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

Robolectric.application;

对于 3.x 版:

RuntimeEnvironment.application;

对于 4.x 版:

  • 添加到您的build.gradle文件中:

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

    ApplicationProvider.getApplicationContext()
    
于 2012-12-03T18:10:23.107 回答
26

您可以使用

RuntimeEnvironment.application
于 2015-03-31T11:28:26.740 回答
20

添加

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

并使用:

private val app = ApplicationProvider.getApplicationContext()
于 2018-12-24T08:08:48.650 回答
19

用这个:

Robolectric.application
于 2013-01-31T04:27:41.080 回答
8

对于 2019 年最新的 Robolectric 4.3 `

ShadowApplication.getInstance()

` 和

机器人应用

都被贬低了。所以我正在使用

Context context = RuntimeEnvironment.systemContext;

获取上下文。

于 2019-07-02T14:52:34.773 回答
5

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

  1. 注释@RunWith(RobolectricTestRunner.class)
  2. RuntimeEnvironment.application.getApplicationContext()
于 2017-11-12T03:03:01.810 回答
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$ 在此处输入图像描述 在此处输入图像描述

于 2019-10-07T17:19:19.363 回答
2

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

testImplementation 'androidx.test:core:1.2.0'

然后使用:

ApplicationProvider.getApplicationContext() as Application

于 2019-07-10T22:00:33.257 回答
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' }

于 2016-08-30T10:42:56.733 回答
2

这适用于 Robolectric 3.5.1:ShadowApplication.getInstance().applicationContext

于 2018-01-10T23:20:08.293 回答
2

从 7 月 21 日的4.0-alpha-3 版本开始,他们删除了 ShadowApplication.getApplicationContext(). 坚持RuntimeEnvironment.application.getApplicationContext()使用@RunWith(RobolectricTestRunner::class).

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

final Context context = RuntimeEnvironment.application;

(请注意,javadocsRuntimeEnvironmentShadowApplication当前反映的是非 alpha 3.x 版本。)

于 2018-08-14T07:55:40.103 回答
1

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

于 2014-11-10T05:55:55.913 回答
1

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

    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
于 2017-07-13T17:51:08.103 回答
1

在你的情况下,我认为你应该注意你实际测试的是什么。有时遇到无法测试的代码或看似无法测试的代码的问题表明您的代码可能需要重构。

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

在这种情况下,重构您尝试测试的代码可能会更好。将响应解析/处理分解到另一个接受简单的类,并通过注入示例字符串响应对该类String进行测试。

这或多或少遵循单一职责依赖倒置的思想(SOLID中的SD

于 2015-11-13T22:05:22.787 回答