我们如何在 Robolectric 获取应用程序的上下文?

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

60980 次浏览

更新。

只需使用1.x 和2.x 版本:

Robolectric.application;

对于3.x 版本:

RuntimeEnvironment.application;

对于版本4.x:

  • 添加到 build.gradle文件:

    testImplementation 'androidx.test:core:1.0.0'
    
  • retrieve the context with:

    ApplicationProvider.getApplicationContext()
    

Use this:

Robolectric.application

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

你可以用

RuntimeEnvironment.application

对于你的情况,我认为你应该注意你实际上在测试什么。有时遇到 untestable代码问题或者看起来不可测试的代码是一个信号,表明您的代码可能需要重构。

对于 API 调用响应,您可能不希望测试 API 调用本身。可能没有必要测试是否可以从任意 Web 服务发送/接收信息,而是测试您的代码 处理和处理你的反应在一个预期的庄园。

在这种情况下,重构您试图测试的代码可能会更好。将响应解析/处理分解到另一个类,该类接受一个简单的 String,并通过注入样本字符串响应来测试 on that class

This is more or less following the ideas of 单一责任 and Dependency Inversion (The 是的 and D in 很可靠)

同意“ EugenMartynov”和“ rds”的回答。

一个快速的例子可以在沃利-棉花糖-释放找到

在 NetworkImageViewTest.java 中

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

排球连接可用 https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release

你必须在 android 工作室的截击模块中添加依赖项:

附属事项{ testCompile 'junit:junit:4.12' TestCompile‘ org.modito: micito-core: 1.10.19’ TestCompile‘ org.robolecric: 3.1.2’ }

好吧,我知道很多人都说过这个答案,可能已经过时了

    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

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

  1. annotate @RunWith(RobolectricTestRunner.class)
  2. Application.getApplicationContext ()

这对我的机器电子3.5。1: ShadowApplication.getInstance().applicationContext工作

从7月21日的 释放4.0-alpha-3开始,他们使用 removed ShadowApplication.getApplicationContext()。坚持使用 RuntimeEnvironment.application.getApplicationContext()进行任何带有 @RunWith(RobolectricTestRunner::class)注释的测试。

顺便说一句,他们的 当前指南有一个获取字符串资源的例子:

final Context context = RuntimeEnvironment.application;

(请注意,RuntimeEnvironmentShadowApplication的 javadocs 目前反映了非 alpha 3.x 版本。)

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

使用:

private val app = ApplicationProvider.getApplicationContext()

2019年的最新机器电子4.3

ShadowApplication.getInstance ()

还有

Roboletric.application

都被破坏了,所以我在用

Context context = RuntimeEnvironment.systemContext;

to get Context.

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

testImplementation 'androidx.test:core:1.2.0'

然后使用:

ApplicationProvider.getApplicationContext() as Application

在某些情况下,您可能需要您的应用程序的上下文,而不是 Robolectris 默认上下文。 例如,如果希望获取包名称。默认情况下,Robolectic 将返回您的 org.robolectric.default包名称。要获得您的真实软件包名称,请执行以下操作:

建造,分级

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