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

时间:2012-12-03 13:18:47

标签: robolectric

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

14 个答案:

答案 0 :(得分:196)

<强>更新

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

Robolectric.application;

对于版本3.x:

RuntimeEnvironment.application;

答案 1 :(得分:25)

您可以使用

RuntimeEnvironment.application

答案 2 :(得分:18)

使用此:

Robolectric.application

答案 3 :(得分:9)

添加

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

并使用:

private val app = ApplicationProvider.getApplicationContext()

答案 4 :(得分:4)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

release 4.0-alpha-3到7月21日,他们removed $('#form_create_circle').submit(function(event) { event.preventDefault(); $.ajax({ url: 'form-create-circle.php', type: 'POST', data: $('#form_create_circle').serialize(), dataType: 'json', success: function(response) { console.log(response); $('#title, #invite, #color').removeClass('is-invalid'); $("[id^=invalid]").empty(); // empty all error divs if ("123".indexOf(response) > -1) { var type = ["", "title", "invite", "color"][response]; $('#' + type).addClass('is-invalid'); $('#invalid_' + type).html('<div class="invalid-feedback"><p>This field is required.</p></div>'); } else { // success message $('#_noti-container').html('<div class="noti noti-success noti-top-right noti-close-on-click noti-on-leave" style="z-index:100000"><div class="noti-content-wrapper"><div class="noti-content">Circle has been created!</div><div class="noti-close">×</div></div></div>'); } } }); }); 。坚持使用RuntimeEnvironment.application.getApplicationContext()进行任何用ShadowApplication.getApplicationContext()注释的测试。

顺便说一句,他们的current guide举例说明了使用以下方法获取字符串资源:

@RunWith(RobolectricTestRunner::class)

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

答案 7 :(得分:2)

对于截至2019年的最新Robolectric 4.3

  

ShadowApplication.getInstance()

`和

  

Roboletric.application

都被描述。所以我正在使用

Context context = RuntimeEnvironment.systemContext;

获取上下文。

答案 8 :(得分:1)

使用Robolectric.getShadowApplication()而不是直接使用Robolectric.application更安全。

答案 9 :(得分:1)

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

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

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

这或多或少遵循单一责任依赖性倒置的想法( S D SOLID

答案 10 :(得分:1)

同意@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' }

答案 11 :(得分: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

答案 12 :(得分:1)

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

testImplementation 'androidx.test:core:1.2.0'

然后使用:

ApplicationProvider.getApplicationContext() as Application

答案 13 :(得分:1)

在某些情况下,您可能需要应用程序的上下文,而不是Robolectris默认上下文。 例如,如果您想获取软件包名称。默认情况下,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 $ enter image description here enter image description here