2016-12-02 4 views
1

ライブラリRobolectric可能な別のフレームワークを使用しました。 Androidのhttp://loopj.com/android-async-http/ユニットテストhttpリクエストアンドロイド

static AsyncHttpClient client = new AsyncHttpClient(); 

public static void getData (final ServerCallback callback) { 

    client.get("http://httpbin.org/get", new AsyncHttpResponseHandler() { 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
      callback.onSuccess(statusCode, new String(responseBody)); 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
      callback.onFailure(statusCode, new String(responseBody)); 
     } 

    }); 
} 

テストクラスのHTTPクライアント:

@RunWith(RobolectricTestRunner.class) 
public class ApiTest{ 

@Test 
public void testgetData() { 

} 

} 

インタフェース

public interface ServerCallback { 
    // Api detect connection 
    void onSuccess(int statusCode, String response); 
    void onFailure(int statusCode, String response); 
} 
+0

あなたはそれを嘲笑しようとしましたか? – abbath

+0

どのようにonSuccessとonFailureをテストしたいですか –

+0

この問題の解決策を見つけました – Ezio

答えて

1

Роман、

私はあなたが右に行く得るために一般的な答えを提供します方向。 httpリクエストをテストする私の好みの方法はsquare okhttp mockwebserverです。あなたの使用について質問がある場合は、project's unit testsを確認してください。あなたの特定のケースで

、アドレスに物事のカップルがあります:

  • あなたはベースURL
  • アンドロイド-非同期HTTPテストで使用されているオーバーライドする必要がありますライブラリは非同期ですが、一貫した単体テストを実行するには、リクエスト/レスポンスを同期させることが望ましいでしょう。

この例では、テストを設定しましょうient次のように:

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.LOLLIPOP) 
public class TestHttpRequestTest { 

    @Rule 
    public MockWebServer mockWebServer = new MockWebServer(); 

    @Test 
    public void getData_onSuccess_doesSomething() throws InterruptedException { 
     // Here we are creating a mock ServerCallback. We will use 
     // this mock object to verify the callback is invoked 
     ServerCallback callback = mock(ServerCallback.class); 

     // To test the client, we need to send a request to the mock mockWebServer. 
     // The MockWebServer spins up an actual backend to handle calls. You MUST 
     // setup the client to use the base Url of the mockWebServer instead of 
     // the actual url e.g.: http://httpbin.org. 
     TestHttpClient.baseUrl = mockWebServer.url("/").toString(); 

     // For testing, use a synchronous client so that we can get the response before 
     // the test completes. 
     TestHttpClient.client = new SyncHttpClient(); 

     // Set up the mockWebServer to return a MockResponse with 
     // some data in the body. This data can be whatever you want... json, xml, etc. 
     // The default response code is 200. 
     mockWebServer.enqueue(new MockResponse().setBody("success")); 
     // To simulate an error 
     // mockWebServer.enqueue(new MockResponse().setResponseCode(500).setBody("error")); 

     TestHttpClient.getData(callback); // calling the method under test 

     verify(callback).onSuccess(200, "success"); // using verify of mockito 
    } 
} 

注:

public class TestHttpClient { 
    // package-local client that can be set in tests 
    static AsyncHttpClient client = new AsyncHttpClient(); 
    // package-local baseUrl that can be set in tests 
    static String baseUrl = "http://pastbin.org/"; 

    public static void getData(final ServerCallback callback) { 
     String url = baseUrl + "get"; 
     client.get(url, new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
       callback.onSuccess(statusCode, new String(responseBody)); 
      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
       callback.onFailure(statusCode, new String(responseBody)); 
      } 
     }); 
    } 
} 

がサーバにリクエストをするために、テストとセットアップのクライアントのためにサーバをスピンアップするためにMockWebServerを使用し、TestHttpClientをテストするには

  • async http clientライブラリでは、一部のアンドロイドシステムコンポーネントが正しく動作する必要があるため、@RunWith(...)注釈
  • 012を使用する必要があります
  • MockWebServer Robotlectricで動作するには、sdkをv21以上に設定した@Config(sdk = 21)が必要です。

build.gradle

dependencies { 
     testCompile 'com.squareup.okhttp3:mockwebserver:3.2.0' 
     testCompile 'org.mockito:mockito-core:1.10.19' 
    } 

ハッピーテストに以下を追加し、プロジェクトにmockwebserver & mockitoを含めるように!!!

+0

助けてくれてありがとう...エラーはメソッド 'mock(java.long.Class)'を解決できず、メソッド 'verify(java.long.Class)を解決できません。クラス) ' –

+0

'mock'と' verify'は[mockitoライブラリ](http://site.mockito.org/)のメソッドです。 mockitoを含めるために、回答の追加の依存関係を更新しました。 – abest

関連する問題