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

标签 android unit-testing robolectric retrofit rx-java

我正在尝试使用 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/

相关文章:

android - 获取原始文件夹中歌曲的歌曲时长并将其转换为String数组?

asp.net - 在 Visual Studio Web Developer Express 2010 中测试

php - 使用 Laravel 和 Pest 测试多维数组

android - 在项目 'testDebug' 中找不到名称为 ':module' 的任务

java - 如何从服务器获取数据并在 Android 上填充 SQL 数据库?

Android 2.3 上的 JavaScript – "this"不工作?

android - 使用新的 Android Studio 项目,任务 ':app:dexDebug' 的 Gradle 执行失败

c# - 生成序列的可读单元测试?

android - 单元测试 BroadcastReceiver

android - 运行时异常运行 robolectric 测试 IntelliJ