5

thiết lập của tôi:kiểm tra một dự án có sử dụng ActionBarSherlock

  1. Thư viện dự án: ActionBarSherlock
  2. Dự án
  3. dự án thử nghiệm

dự án của tôi có các dự án thư viện liên kết dưới dạng dự án thư viện. Nó biên dịch và chạy tốt.

Bây giờ tôi cố gắng thử nghiệm ứng dụng của mình bằng cách sử dụng dự án thử nghiệm bình thường. Chạy các bài kiểm tra trong nhật thực hoạt động hoàn hảo. Nếu tôi cố chạy thử nghiệm bằng kiến, dự án thử nghiệm thậm chí không biên dịch:

[javac] LoginActivityTest.java:9: cannot access com.actionbarsherlock.app.SherlockActivity 
[javac] class file for com.actionbarsherlock.app.SherlockActivity not found 
[javac] public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 
[javac]                  ^
[javac] LoginActivityTest.java:25: cannot find symbol 

Xây dựng qua eclipse hoạt động hoàn hảo và chạy thử hoàn hảo.

Nếu tôi liên kết dự án thư viện với dự án thử nghiệm của tôi, nó biên dịch với kiến ​​nhưng các kiểm tra không thành công.

[exec] Error in testSuiteConstructionFailed: 
[exec] java.lang.RuntimeException: Exception during suite construction 
[exec]  at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
[exec]  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
[exec]  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537) 
[exec]  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) 
[exec] Caused by: java.lang.reflect.InvocationTargetException 
[exec]  at java.lang.reflect.Constructor.constructNative(Native Method) 
[exec]  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
[exec]  at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87) 
[exec]  at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:262) 
[exec]  at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:184) 
[exec]  at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:371) 
[exec]  at com.zutubi.android.junitreport.JUnitReportTestRunner.onCreate(JUnitReportTestRunner.java:90) 
[exec]  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3891) 
[exec]  at android.app.ActivityThread.access$1300(ActivityThread.java:122) 
[exec]  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184) 
[exec]  at android.os.Handler.dispatchMessage(Handler.java:99) 
[exec]  at android.os.Looper.loop(Looper.java:137) 
[exec]  at android.app.ActivityThread.main(ActivityThread.java:4340) 
[exec]  at java.lang.reflect.Method.invokeNative(Native Method) 
[exec]  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
[exec]  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
[exec]  at dalvik.system.NativeStart.main(Native Method) 
[exec] Caused by: java.lang.NoClassDefFoundError: com.myproject.android.app.activities.LoginActivity 
[exec]  at com.myproject.android.app.test.LoginActivityTest.<init>(LoginActivityTest.java:18) 
[exec]  ... 19 more 

lớp thử nghiệm của tôi:

public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> { 

    private LoginActivity mActivity; 

    private EditText  mTextUserName; 

    private EditText  mTextUserPassword; 

    public LoginActivityTest() { 
     // the super call is line 18 (see stack trace above) 
     super("com.myproject.android.app.activities", LoginActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     mActivity = getActivity(); 
     mTextUserName = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_username); 
     mTextUserPassword = (EditText) mActivity.findViewById(com.myproject.android.app.R.id.login_activity_password); 
    } 

    public void testPreConditions() { 
     assertTrue("Activity is null!", mActivity != null); 
    } 

    public void testLogin() throws Throwable { 
     mActivity.runOnUiThread(new Runnable() { 
      public void run() { 
       mTextUserName.setText("username"); 
       mTextUserPassword.setText("password"); 
      } 
     }); 
     sendKeys(KeyEvent.KEYCODE_ENTER); 
    } 
} 

Một số ý tưởng làm thế nào tôi có thể sửa lỗi này?

Cập nhật: có vẻ như việc xây dựng/thử nghiệm kiến ​​vẫn là một mớ hỗn độn. Theo mục nhập blog này về testing a library project, hầu hết 7 sự cố được liệt kê sẽ được khắc phục trong bản phát hành ADT tiếp theo (ADT r20).

Trả lời

7

Có rất nhiều thông tin khác nhau nổi xung quanh việc sử dụng các dự án Library vì ADT 17 đã phá vỡ/cố định mọi thứ (tùy thuộc vào thời điểm bạn hiện đang đập đầu vào bàn của bạn).

Trước hết, hãy lưu ý sự khác biệt giữa Library và "thư viện" trong đó Library là danh từ theo quy định của nhóm Android. Tôi cũng đang sử dụng dự án Referencing mô tả dự án sử dụng dự án Library.

tức là, dự án A Referencing sử dụng dự án Library.

phi Library "thư viện" Dự án

Trong phát triển Java bình thường nó có thể liên kết các dự án trong Eclipse nơi người ta phụ thuộc vào nguồn gốc của người kia. Tôi tin rằng cách tiếp cận này có tác dụng sử dụng nguồn dự án thư viện làm nguồn cho dự án tham chiếu. Điều này có nghĩa là nguồn dự án thư viện nằm trong phạm vi trong khi biên soạn dự án tham chiếu. Các lớp dự án thư viện được xây dựng cùng lúc với các lớp của dự án tham chiếu.

Khi xây dựng để sử dụng trong hầu hết các trường hợp, công trình này hoạt động hoàn hảo như tất cả các lớp được xây dựng và sau đó được đóng gói trong JAR hoặc WAR hoặc bất kỳ thứ gì.

Dự án Thư viện

Một cạnh tranh (không một sự pha trộn và kết hợp) Cách tiếp cận với các dự án thư viện là các đội bóng Android Library dự án:

dự án

Một Android được đánh dấu như là một dự án Library sẽ biên dịch và xây dựng nguồn của nó thành một tệp jar trong thư mục bin của nó (sau lệnh sạch/xây dựng). Bất kỳ dự án Referencing nào tự động nhập jar này và giành quyền truy cập vào chức năng dự án Library. Bạn có thể thấy mối quan hệ này bằng cách xem bên trong Thư viện Java Android Dependencies trong Trình khám phá gói.

Cùng với độ phân giải phụ thuộc lớp, tài nguyên cũng được tham chiếu trực tiếp và được biên dịch thành các tệp R.java bên trong các thư mụcgen.

Các ADT vấn đề giới thiệu mới cho dân lập vì nó thêm vào "hỗ trợ" cho bao gồm lọ đã được tham chiếu bởi Library dự án:

Pre ADT 17

Dự án Library đã có một jar thêm vào đường dẫn xây dựng của nó. Dự án Referencing cũng có thể thêm bình vào số riêng đường dẫn xây dựng của riêng mình.

ADT 17 trở đi

Dealing With Dependencies

Sau ADT 17 Library dự án tự động tham chiếu lọ riêng của họ bắt đầu có biểu hiện lạ. Nó không chỉ đơn giản là một trường hợp bao gồm cùng một tham chiếu phụ thuộc vào dự án Referencing của bạn để giữ cho bình có thể nhìn thấy trong cả hai phạm vi. Điều này bây giờ dẫn đến trùng lặp lạ của các lớp học bao gồm.

Thật không may, chỉ cần xóa thư viện khỏi dự án Referencing hoặc Library (do đó chỉ có một liên kết), sau đó nhầm lẫn nhật thực, nó không còn có thể thấy bình từ phạm vi của Dự án sử dụng nó.

Để khắc phục điều này, bạn cần đặt các chạc dự án Library vào thư mục /libs - đây có thể là một cơn đau ở phía sau nếu bạn đang ở những nơi bị phân tán trên đĩa cứng của bạn. Các lọ này sẽ tự động được sử dụng trong các dự án LibraryReferencing của bạn.

Vì vậy, để di chuyển qua ADT 17:

  • Hủy bỏ bất kỳ tập tin jar không được sử dụng như một nguồn tin trong phạm vi dự án hiện tại (cho dù đây là của bạn dự án Library hoặc Referencing).
  • Xóa các dự án "thư viện" khỏi dự án Library của bạn (thay vì biên dịch chúng thành các lọ).
  • Xóa các lọ bên ngoài khỏi dự án Library của bạn, thay vào đó hãy sao chép chúng vào thư mục libs.
Các vấn đề liên quan