2013-09-04 29 views
31

Tôi muốn biết làm cách nào để tạo thử nghiệm đơn vị cho khung bóng chuyền. Giả lập các yêu cầu, các câu trả lời để tôi có thể tạo các bài kiểm tra đơn vị sẽ không yêu cầu một dịch vụ web để làm việc và truy cập mạng.Thử nghiệm đơn vị với bóng chuyền Android

Tôi đã googled nó nhưng tôi không tìm thấy nhiều thông tin về khuôn khổ hoàn toàn chắc chắn

+2

Giải pháp của tôi cho phản hồi giả mạo là tạo FakeHttpStack triển khai HttpStack. Sau đó, bạn có thể nhận được RequestQueue như RequestQueue mới (new NoCache(), new BasicNetwork (new FakeHttpStack())); – Kazuki

+0

Hiện tại không có tài liệu nào tôi có thể tìm thấy. Nhưng có rất nhiều mẫu và video Google IO 2013 cũng dễ dàng đào sâu. –

+0

@Kazuki Bạn có thể để điều đó như một câu trả lời không? Cho đến nay nó là câu trả lời thực sự duy nhất ở đây. –

Trả lời

0

Không phải 100% rằng tôi hiểu những gì bạn muốn làm, nhưng nếu tôi làm, sau đó EasyMock (một lib mà cho phép tạo các lớp mô phỏng, mà bạn có thể thực hiện cuộc gọi và nhận các câu trả lời được xác định trước) sẽ giúp bạn rất nhiều. Một chàng trai tên là Lars Vogel có một bài viết hay về chủ đề này mà tôi thấy hữu ích khi tôi sử dụng nó.

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

8

Hãy nhìn vào bóng tests thư mục, có bạn có thể tìm thấy các ví dụ.

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

Liên kết tới nguồn đã chết. – Greyson

+0

@Greyson cập nhật liên kết. –

20

tôi thực hiện một lớp con của HttpStack tên FakeHttpStack rằng tải cơ thể phản ứng giả từ tập tin địa phương nằm trong res/raw. Tôi đã làm điều này cho mục đích phát triển, tức là tôi có thể phát triển một cái gì đó cho API mới trước khi máy chủ sẵn sàng, nhưng bạn có thể tìm hiểu điều gì đó (ví dụ: ghi đè HttpStack # peformRequest và createEntity) từ đây.

/** 
* 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; 
    } 
} 

Để sử dụng FakeHttpStack, bạn chỉ cần phải vượt qua nó để bạn RequestQueue. Tôi cũng ghi đè lên RequestQueue.

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

Điểm tốt cho phương pháp này là không yêu cầu nhiều thay đổi trong mã của bạn. Bạn chỉ cần chuyển đổi Yêu cầuQueue thành FakeRequestQueue khi thử nghiệm. Do đó, nó có thể được sử dụng trong thử nghiệm chấp nhận hoặc kiểm tra hệ thống.

Mặt khác, để kiểm tra đơn vị, có thể có cách nhỏ gọn hơn. Ví dụ: bạn có thể triển khai lớp học Yêu cầu.Listener của bạn dưới dạng lớp riêng biệt để có thể dễ dàng kiểm tra phương pháp onResponse. Tôi khuyên bạn nên đặt chi tiết hơn về những gì bạn muốn thử nghiệm hoặc đặt một số đoạn mã.

+0

Bạn có thể mở rộng Volley.java và ghi đè newRequestQueue() để cung cấp cho FakeRequestQueue. Nếu bạn sử dụng tiêm phụ thuộc, bạn có thể chỉ cần tiêm MyVolley.java thay vì Volley.java mặc định để mã ứng dụng của bạn không yêu cầu bất kỳ thay đổi nào để thử nghiệm. – Christine

+0

Bạn có thể hướng dẫn tôi cách thực hiện phản hồi cho yêu cầu bóng chuyền thử nghiệm đơn vị. – Dory

+0

Xin chào, tôi đã triển khai fakeRequestQueue, nhưng nó không đưa ra bất kỳ phản hồi nào. Có một cái nhìn ở đây http://stackoverflow.com/questions/32623129/android-studio-unit-test-issues-in-writing-mock-tests-for-volley-request-fini – Dory