[英]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特定的替代方案 ( 不太優雅的恕我直言,但它適用於所有情況 )是使用一個只在測試期間可訪問和使用的私有變量,使用這樣的反射:
要執行反射部分,請使用以下示例:
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.