2013-09-04 22 views
31

ボレーフレームワークのユニットテストを作成するにはどうすればいいですか?リクエストを嘲笑して、ウェブサービスが動作しネットワークアクセスが必要ない単位テストを作成できるようにしてください。Androidボレーのユニットテスト

私はそれをGoogleで検索しましたが、私は、私はあなたが何をしたいのかを理解し、私がしなければ、その後、(libがeasymockことをすべて

+2

私の解決策は、HttpStackを実装するFakeHttpStackを作成することです。次に、新しいRequestQueue(新しいNoCache()、新しいBasicNetwork(新しいFakeHttpStack()))のようにRequestQueueを取得できます。 – Kazuki

+0

現在、私が見つけることのできる文書はありません。しかし、たくさんのサンプルがあり、Google IO 2013のビデオも簡単に入手できます。 –

+0

@かずき答えとして残すことはできますか?今のところ本当の答えはこれだけです。 –

答えて

0

ない100%確かでフレームワークについて多くの情報を見つけることができませんのであなたに電話をかけたり、あらかじめ決められた反応を受け取ることができるモッククラスの作成を許可します)、あなたを助けます。 Lars Vogelと呼ばれる男に、このトピックに関するすばらしい記事がありました。私はそれを使用したときに、役に立つと思いました。

http://www.vogella.com/articles/EasyMock/article.html

8

あなたが例を見つけることができますが、ボレーtestsフォルダを見てみましょう。

MockCache.java 
MockHttpClient.java 
MockHttpStack.java 
MockHttpURLConnection.java 
MockNetwork.java 
MockRequest.java 
MockResponseDelivery.java 
+0

ソースへのリンクが死んでいます。 – Greyson

+0

@Greyson更新されたリンク。 –

20

私はRES /生にあるローカルファイルから偽のレスポンスボディを読み込むFakeHttpStackという名前HttpStackのサブクラスを実装しました。私は開発の目的でこれを行いました。つまり、サーバーの準備が整う前に新しいAPI用に開発することができますが、ここからHttpStack#peformRequestやcreateEntityをオーバーライドするなどの方法があります。

/** 
* Fake {@link HttpStack} that returns the fake content using resource file in res/raw. 
*/ 
class FakeHttpStack implements HttpStack { 
    private static final String DEFAULT_STRING_RESPONSE = "Hello"; 
    private static final String DEFAULT_JSON_RESPONSE = " {\"a\":1,\"b\":2,\"c\":3}"; 
    private static final String URL_PREFIX = "http://example.com/"; 
    private static final String LOGGER_TAG = "STACK_OVER_FLOW"; 

    private static final int SIMULATED_DELAY_MS = 500; 
    private final Context context; 

    FakeHttpStack(Context context) { 
     this.context = context; 
    } 

    @Override 
    public HttpResponse performRequest(Request<?> request, Map<String, String> stringStringMap) 
      throws IOException, AuthFailureError { 
     try { 
      Thread.sleep(SIMULATED_DELAY_MS); 
     } catch (InterruptedException e) { 
     } 
     HttpResponse response 
       = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK")); 
     List<Header> headers = defaultHeaders(); 
     response.setHeaders(headers.toArray(new Header[0])); 
     response.setLocale(Locale.JAPAN); 
     response.setEntity(createEntity(request)); 
     return response; 
    } 

    private List<Header> defaultHeaders() { 
     DateFormat dateFormat = new SimpleDateFormat("EEE, dd mmm yyyy HH:mm:ss zzz"); 
     return Lists.<Header>newArrayList(
       new BasicHeader("Date", dateFormat.format(new Date())), 
       new BasicHeader("Server", 
         /* Data below is header info of my server */ 
         "Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e") 
     ); 
    } 

    /** 
    * returns the fake content using resource file in res/raw. fake_res_foo.txt is used for 
    * request to http://example.com/foo 
    */ 
    private HttpEntity createEntity(Request request) throws UnsupportedEncodingException { 
     String resourceName = constructFakeResponseFileName(request); 
     int resourceId = context.getResources().getIdentifier(
       resourceName, "raw", context.getApplicationContext().getPackageName()); 
     if (resourceId == 0) { 
      Log.w(LOGGER_TAG, "No fake file named " + resourceName 
        + " found. default fake response should be used."); 
     } else { 
      InputStream stream = context.getResources().openRawResource(resourceId); 
      try { 
       String string = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8)); 
       return new StringEntity(string); 
      } catch (IOException e) { 
       Log.e(LOGGER_TAG, "error reading " + resourceName, e); 
      } 
     } 

     // Return default value since no fake file exists for given URL. 
     if (request instanceof StringRequest) { 
      return new StringEntity(DEFAULT_STRING_RESPONSE); 
     } 
     return new StringEntity(DEFAULT_JSON_RESPONSE); 
    } 

    /** 
    * Map request URL to fake file name 
    */ 
    private String constructFakeResponseFileName(Request request) { 
     String reqUrl = request.getUrl(); 
     String apiName = reqUrl.substring(URL_PREFIX.length()); 
     return "fake_res_" + apiName; 
    } 
} 

FakeHttpStackを使用するには、あなたは自分のREQUESTQUEUEにそれを渡す必要があります。私はRequestQueueもオーバーライドします。

public class FakeRequestQueue extends RequestQueue { 
    public FakeRequestQueue(Context context) { 
     super(new NoCache(), new BasicNetwork(new FakeHttpStack(context))); 
    } 
} 

このアプローチのポイントは、コードに大きな変更は必要ありません。テストの際にRequestQueueFakeRequestQueueに切り替えるだけで済みます。したがって、受入れテストまたはシステムテストに使用することができます。

一方、単体テストの場合、よりコンパクトな方法があるかもしれません。たとえば、Request.Listenerサブクラスを別のクラスとして実装すると、onResponseメソッドを簡単にテストできます。私はあなたがテストしたいものやコードの断片を入れたいと思ったことについて、より詳細に記述することをお勧めします。

+0

Volley.javaを拡張し、newRequestQueue()をオーバーライドしてFakeRequestQueueを与えることができます。依存関係注入を使用する場合は、デフォルトのVolley.javaの代わりにMyVolley.javaを単に注入するだけで、テストのためにアプリケーションコードを変更する必要がなくなります。 – Christine

+0

ユニットテストのボレーリクエストのためのレスポンスを模擬する方法を教えてもらえますか? – Dory

+0

こんにちは、私はfakeRequestQueueを実装しましたが、それは何の応答も与えていません。ここを見てくださいhttp://stackoverflow.com/questions/32623129/android-studio-unit-test-issues-in-writing-mock-tests-for-volley-request-fini – Dory

関連する問題