gpt4 book ai didi

android - Robolectric + OkHttp + 改造 + rxJava 单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:41 24 4
gpt4 key购买 nike

我正在尝试使用 robolectric 为一段代码编写单元测试。问题是我需要伪造 http 调用,但根据这个答案,robolectric 的伪造层似乎只适用于 Apache 的 HttpClient:

Link to answer

在 Retrofit 中,您无法更改 URL,因此 MockWebServer 似乎不是一个选项。

似乎 mockito 可以捕获 retrofit 回调,但我使用的是 rxJava,所以我真的不知道它是否有帮助。

有人对使用 Robolectric + Retrofit + okHttp + rxJava 进行单元测试有什么建议吗?

这是一小段代码:

    @Test
public void test1() throws IOException, InterruptedException {
FragmentA frag = (FragmentA) activity
.getFragmentManager().findFragmentById(
R.id.frag);
assertThat(frag).isNotNull();
assertThat(frag.isVisible()).isTrue();

EditText input1 = (EditText) frag.getView()
.findViewById(R.id.edit_text1);
EditText input2 = (EditText) frag.getView()
.findViewById(R.id.edit_text2);
Button button = (button) frag.getView()
.findViewById(R.id.button);
input1.setText("999");
input2.setText("999");
Robolectric.addPendingHttpResponse(200, "{\"isValid\": true}");
button.performClick();
assertThat(
ShadowAlertDialog.getLatestDialog() instanceof ProgressDialog)
.isTrue();

}

由于 OkHttp,Robolectric.addPendingHttpResponse 无论如何都不会工作。按下按钮时将启动 api 调用,因此在那一刻我需要伪造响应!

最佳答案

您可以从 build.gradle 中声明的常量获取服务器 URL,并添加覆盖它的测试风格或构建类型

release {
buildConfigField "String", "SERVER_URL", "\"github.com\""
}
testing {
buildConfigField "String", "SERVER_URL", "\"127.0.0.1\""
}

另一个替代方案不是 Android 特定的,(恕我直言,但它在所有情况下都有效)是使用一个私有(private)变量,它只能在测试期间访问和使用,使用像这样的反射:

  1. 创建一个为null的私有(private)静态变量,即private static String BASE_URL = null;
  2. 使用一种方法获取主机 URL,并在该方法中检查是否使用 BASE_URL(当它不为空时(从不在发布版本中)或来自资源的 URL(从不在代码中硬编码 URL)<
  3. 在测试期间,使用反射将私有(private)可见性更改为公共(public)可见性,并将 BASE_URL 修改为您的测试 URL。

做反射部分使用这个例子:

final Field urlField = MyService.class.getDeclaredField("BASE_URL");
urlField.setAccessible(true);
urlField.set(null, TEST_URL );

关于android - Robolectric + OkHttp + 改造 + rxJava 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com