实际上,我需要获得API调用的响应,因为我需要Context
。
答案 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)
要获取应用程序上下文,您必须执行以下操作:
答案 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)
(请注意,RuntimeEnvironment
和ShadowApplication
的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());
}
}