2012-01-24 43 views
20

Tôi đang cố tạo một thử nghiệm thử nghiệm bằng cách sử dụng khuôn khổ Fitnesse và tôi muốn thử nghiệm một hàm lấy dữ liệu từ máy chủ (dịch vụ RESTFUL). trường hợp thử nghiệm của tôi rất đơn giản:Lỗi java.lang.RuntimeException: Stub! trong Android với thử nghiệm Fitnesse

public class FriendListActivityFixture extends ColumnFixture { 
    public int URL; 
    public String test() { 
    JSONArray array = JsonHelper.getJsonArrayFromUrl("http://107.22.209.62/android/get_users.php"); 
    return array.toString(); 
    } 
} 

public static JSONArray getJsonArrayFromUrl(String url) { 
     InputStream input = null; 
     String result = ""; 
     JSONArray jsonArray = null; 
     try { 
      HttpClient httpclient = CustomHttpClient.getHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      input = entity.getContent(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error in http connection " + e.toString()); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input, "iso-8859-1"), 8); 
      StringBuilder content = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       content.append(line + "\n"); 
      } 
      input.close(); 
      result = content.toString(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error parsing result " + e.toString()); 
     } 

     try { 
      jsonArray = new JSONArray(result); 
     } 
     catch (JSONException e) { 
      Log.e(TAG + "getJsonArrayFromUrl(String url)", "Error converting data " + e.toString()); 
     } 
     return jsonArray; 
    } 

Và đây là trang Fitnesse kiểm tra: con đường fitnesse.jar

!path C:\Program Files (x86)\Android\android-sdk\platforms\android-10\android.jar 
!path C:\Users\chan\git\Spotr\Spotr\bin\classes 

!|com.csun.spotr.fitnesse.FriendListActivityFixture| 
|URL|test?| 
|0|"wwa"| 

Kể từ khi nó chỉ là một bản demo, thử nghiệm của tôi có thể nhìn một chút ngớ ngẩn vào lúc này . Rất tiếc, tôi vẫn gặp phải các lỗi này:

java.lang.RuntimeException: Stub! 
    at android.util.Log.e(Log.java:15) 
    at com.csun.spotr.util.JsonHelper.getJsonArrayFromUrl(JsonHelper.java:75) 
    at com.csun.spotr.fitnesse.FriendListActivityFixture.test(FriendListActivityFixture.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at fit.TypeAdapter.invoke(TypeAdapter.java:109) 
    at fit.TypeAdapter.get(TypeAdapter.java:97) 
    at fit.Fixture$CellComparator.compareCellToResult(Fixture.java:371) 
    at fit.Fixture$CellComparator.access$100(Fixture.java:357) 
    at fit.Fixture.compareCellToResult(Fixture.java:299) 
    at fit.Fixture.check(Fixture.java:295) 
    at fit.ColumnFixture.check(ColumnFixture.java:51) 
    at fit.Binding$QueryBinding.doCell(Binding.java:215) 
    at fit.ColumnFixture.doCell(ColumnFixture.java:37) 
    at fit.Fixture.doCells(Fixture.java:171) 
    at fit.Fixture.doRow(Fixture.java:165) 
    at fit.ColumnFixture.doRow(ColumnFixture.java:25) 
    at fit.Fixture.doRows(Fixture.java:159) 
    at fit.ColumnFixture.doRows(ColumnFixture.java:18) 
    at fit.Fixture.doTable(Fixture.java:153) 
    at fit.Fixture.interpretTables(Fixture.java:99) 
    at fit.Fixture.doTables(Fixture.java:79) 
    at fit.FitServer.process(FitServer.java:81) 
    at fit.FitServer.run(FitServer.java:56) 
    at fit.FitServer.main(FitServer.java:41) 

Và tôi không biết nó nói gì với tôi? Tôi đã viết phương pháp thử nghiệm khác như add(), substract(), mọi thứ hoạt động tốt. Tôi tự hỏi không có lỗi này liên quan đến việc chạy một nhiệm vụ dài trên chủ đề chính? Bất kỳ ý tưởng?

Trả lời

36

android.jar chỉ chứa thực thi sơ khai các lớp. Nó cung cấp các phương tiện cho bạn ứng dụng để xây dựng, một khi bạn có APK của bạn, bạn phải chạy nó trên một thiết bị Android hoặc giả lập.

Nếu tôi không sai, bạn đang cố gắng chạy trên JVM của máy chủ.

+0

Cảm ơn, lớp thử nghiệm của tôi không chứa bất kỳ mã Hoạt động nào, vì vậy tôi không hiểu tại sao tôi phải chạy nó trên thiết bị. Dù sao, hãy để tôi thử nó chạy nó trên thiết bị. – Chan

+1

Lỗi tương tự ngay cả khi tôi chạy nó trên điện thoại của mình. Có cách giải quyết nào không? – Chan

+0

bạn có androud.util.Log –

4

Như đã đề cập trước đó, Android jar s không tốt cho bất kỳ điều gì ngoài biên dịch. Thậm chí hầu hết những thứ vô tội đều bị bung ra hoàn toàn. Nhưng bạn vẫn có thể sử dụng chúng trong các bài kiểm tra đơn vị VM máy chủ với các khung mocking tốt. sự lựa chọn của tôi là jmockit:

Không chắc liệu nó sẽ làm việc với Fitnesse dù

+1

Rất cám ơn ví dụ. Tuy nhiên tôi vẫn nghĩ Fitnesse là một cách tốt hơn để viết bài kiểm tra, vì nó dễ dàng hơn trong việc ghi lại tài liệu. – Chan

+1

... nhưng chức năng kiểm tra vẫn quan trọng. Và nó cũng có thể tương thích với khung mocking –

9

Bạn có thể khắc phục vấn đề này và thử nghiệm trong IDE của bạn thực sự dễ dàng bằng cách sử dụng Roboelectric.

Như dtmilano đã nói, bạn không thể chạy mã Android trên máy tính xách tay của bạn như là, nhưng Roboelectric về cơ bản thay thế các phương pháp triển khai thực tế cho các sơ khai trong Android.jar.

Hai điều cần xem ra cho nếu bạn đi với giải pháp này:

  • Hãy chắc chắn rằng nhập khẩu JAR của bạn là ở trên JAR Android trong danh sách phụ thuộc của bạn nếu sử dụng IntelliJ

  • Nó mặc định chặn các yêu cầu HTTP theo giả định rằng bạn không thực sự muốn thay đổi trạng thái của máy chủ ở đâu đó. Bạn có thể, tuy nhiên, vô hiệu hóa điều này khá dễ dàng: Roboelectric.getFakeHttpLayer(). InterceptHttpRequests (false);

Các vấn đề liên quan