实际上,我需要得到 API 调用的响应,因为我需要Context
.
14 回答
更新。
仅用于版本 1.x 和 2.x:
Robolectric.application;
对于 3.x 版:
RuntimeEnvironment.application;
对于 4.x 版:
添加到您的
build.gradle
文件中:testImplementation 'androidx.test:core:1.0.0'
检索上下文:
ApplicationProvider.getApplicationContext()
您可以使用
RuntimeEnvironment.application
添加
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
并使用:
private val app = ApplicationProvider.getApplicationContext()
用这个:
Robolectric.application
对于 2019 年最新的 Robolectric 4.3 `
ShadowApplication.getInstance()
` 和
机器人应用
都被贬低了。所以我正在使用
Context context = RuntimeEnvironment.systemContext;
获取上下文。
要获取应用程序上下文,您必须执行以下操作:
- 注释@RunWith(RobolectricTestRunner.class)
- RuntimeEnvironment.application.getApplicationContext()
在某些情况下,您可能需要应用程序的上下文而不是 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());
}
}
首先将以下内容添加到您的build.gradle
:
testImplementation 'androidx.test:core:1.2.0'
然后使用:
ApplicationProvider.getApplicationContext() as Application
同意@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'
}
这适用于 Robolectric 3.5.1:ShadowApplication.getInstance().applicationContext
从 7 月 21 日的4.0-alpha-3 版本开始,他们删除了 ShadowApplication.getApplicationContext()
. 坚持RuntimeEnvironment.application.getApplicationContext()
使用@RunWith(RobolectricTestRunner::class)
.
顺便说一句,他们当前的指南有一个使用以下方法获取字符串资源的示例:
final Context context = RuntimeEnvironment.application;
(请注意,javadocsRuntimeEnvironment
和ShadowApplication
当前反映的是非 alpha 3.x 版本。)
Robolectric.getShadowApplication()
使用比直接使用更安全Robolectric.application
。
好的,所以我知道很多其他人以前说过这个答案,可能已经过时了
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
在你的情况下,我认为你应该注意你实际测试的是什么。有时遇到无法测试的代码或看似无法测试的代码的问题表明您的代码可能需要重构。
对于 API 调用响应,您可能不想测试 API 调用本身。可能不需要测试是否可以从任意 Web 服务发送/接收信息,而是您的代码以预期的方式处理和处理您的响应。
在这种情况下,重构您尝试测试的代码可能会更好。将响应解析/处理分解到另一个接受简单的类,并通过注入示例字符串响应对该类String
进行测试。
这或多或少遵循单一职责和依赖倒置的思想(SOLID中的S和D)