12

アプリの主要部分がAPIcalls.javaクラスであるAndroidアプリがあります。ここで、サーバーからデータを取得し、アプリにデータを表示するためのhttpリクエストを作成します。

アプリの大部分を占めるこの Java クラスの単体テストを作成したかったのです。サーバーからデータを取得する方法は次のとおりです。

StringBuilder sb = new StringBuilder();

try {

  httpclient = new DefaultHttpClient(); 
  Httpget httpget = new HttpGet(url);

  HttpEntity entity = null;
  try {
    HttpResponse response = httpclient.execute(httpget);
    entity = response.getEntity();
  } catch (Exception e) {
    Log.d("Exception", e);
  }


  if (entity != null) {
    InputStream is = null;
    is = entity.getContent();

    try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));

      while ((line = reader.readLine()) != null) {
       sb.append(line + "\n");
     }
      reader.close();
    } catch (IOException e) {

           throw e;

       } catch (RuntimeException e) {

           httpget.abort();
           throw e;

       } finally {

         is.close();

       }
       httpclient.getConnectionManager().shutdown();
  }
} catch (Exception e) {
  Log.d("Exception", e);
}

String result = sb.toString().trim();

return result;

次のようなテストから簡単な API 呼び出しを行うことができると思いました。

api.get("www.example.com")

しかし、テストからいくつかの http 呼び出しを行うたびに、エラーが発生します。

Unexpected HTTP call GET

ここで何か間違ったことをしていることは知っていますが、Androidでこのクラスを適切にテストするにはどうすればよいか教えてもらえますか?

4

3 に答える 3

7

Robolectric には、DefaultHttpClient の HTTP 応答をモックするためのヘルパー メソッドがいくつか用意されています。これらのメソッドを使用せずに DefaultHttpClient を使用すると、警告メッセージが表示されます。

以下は、http 応答をモックする方法の例です。

@RunWith(RobolectricTestRunner.class)
public class ApiTest {

    @Test
    public void test() {
        Api api = new Api();
        Robolectric.addPendingHttpResponse(200, "dummy");
        String responseBody = api.get("www.example.com");
        assertThat(responseBody, is("dummy"));
    }
}

Robolectric のテスト コードを見ると、さらに多くの例を見つけることができます。

于 2013-09-17T20:32:37.957 に答える
0

この同じ質問の別のバージョンに回答しましたが...

ここにあるのは、Android から何も使用していないため、Robolectric は基本的に無関係です。これはすべて標準の Java と Apache HTTP ライブラリです。HttpClient をシミュレートするには、モック フレームワークと依存性注入が必要です (リンクについては、他の回答を参照してください)。単体テスト中はネットワークにアクセスできないため、失敗します。

Android フレームワークの一部を使用するクラスをテストする場合、Robolectric (または類似のもの) を使用して Android.jar をモックまたはシミュレートできます。これは、単体テスト フレームワークも Android.jar にアクセスできないためです。

于 2013-09-17T15:23:08.453 に答える