实际上,我需要获得一个 API 调用的响应,为此我需要 Context。
Context
更新。
只需使用1.x 和2.x 版本:
Robolectric.application;
对于3.x 版本:
RuntimeEnvironment.application;
对于版本4.x:
添加到 build.gradle文件:
build.gradle
testImplementation 'androidx.test:core:1.0.0'
retrieve the context with:
ApplicationProvider.getApplicationContext()
Use this:
Robolectric.application
使用 Robolectric.getShadowApplication()比直接使用 Robolectric.application更安全。
Robolectric.getShadowApplication()
你可以用
RuntimeEnvironment.application
对于你的情况,我认为你应该注意你实际上在测试什么。有时遇到 untestable代码问题或者看起来不可测试的代码是一个信号,表明您的代码可能需要重构。
对于 API 调用响应,您可能不希望测试 API 调用本身。可能没有必要测试是否可以从任意 Web 服务发送/接收信息,而是测试您的代码 处理和处理你的反应在一个预期的庄园。
在这种情况下,重构您试图测试的代码可能会更好。将响应解析/处理分解到另一个类,该类接受一个简单的 String,并通过注入样本字符串响应来测试 on that class。
String
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
要获得应用程序上下文,您必须执行以下操作:
这对我的机器电子3.5。1: ShadowApplication.getInstance().applicationContext工作
ShadowApplication.getInstance().applicationContext
从7月21日的 释放4.0-alpha-3开始,他们使用 removed ShadowApplication.getApplicationContext()。坚持使用 RuntimeEnvironment.application.getApplicationContext()进行任何带有 @RunWith(RobolectricTestRunner::class)注释的测试。
ShadowApplication.getApplicationContext()
RuntimeEnvironment.application.getApplicationContext()
@RunWith(RobolectricTestRunner::class)
顺便说一句,他们的 当前指南有一个获取字符串资源的例子:
final Context context = RuntimeEnvironment.application;
(请注意,RuntimeEnvironment和 ShadowApplication的 javadocs 目前反映了非 alpha 3.x 版本。)
RuntimeEnvironment
ShadowApplication
加
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包名称。要获得您的真实软件包名称,请执行以下操作:
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 $