簡體   English   中英

Robolectric + OkHttp +改造+ rxJava單元測試

[英]Robolectric + OkHttp + retrofit + rxJava Unit Test

我正在嘗試用robolectric編寫一段代碼的單元測試。 問題是我需要偽造http調用,但似乎robolectric的假層只適用於Apache的HttpClient,根據這個答案:

鏈接回答

在Retrofit中,您無法更改URL,因此MockWebServer似乎不是一個選項。

似乎mockito可以捕獲改進的回調,但我正在使用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,並添加覆蓋它的測試flavor或buildType

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

另一個不是Android特定的替代方案不太優雅的恕我直言,但它適用於所有情況 )是使用一個只在測試期間可訪問和使用的私有變量,使用這樣的反射:

  1. 創建一個null的私有靜態變量,即私有靜態String BASE_URL = null;
  2. 使用方法獲取主機URL,並在該方法中檢查當它不為空時(從不在發布版本中)或來自資源的URL(從不在代碼中對URL進行硬編碼)時是否使用BASE_URL
  3. 在測試期間,使用反射將私有可見性更改為public,並將BASE_URL修改為測試URL。

要執行反射部分,請使用以下示例:

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

為什么不能在改造中更改網址?

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

您可以從MockWebServer設置該URL:

MockWebServer server = new MockWebServer();
URL url = server.getUrl("/");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM