2012-03-01 32 views
18

Tôi đang viết kiểm tra cho một thành phần trong ứng dụng Android của mình. Thành phần này sử dụng các hoạt động để thực hiện một số báo cáo. Vì vậy, tôi cần một hoạt động để kiểm tra các thành phần (kiến trúc xấu xí) và tôi nghĩ rằng nó sẽ được dễ dàng để tạo ra một hoạt động nộm bên trong dự án thử nghiệm và hơn tạo ra các xét nghiệm di truyền từ ActivityInstrumentationTestCase2<TestActivity>, nhưng đối với một số lý do tôi luôn có được java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.xxx/.Testctivity } ngoại lệ.Có thể xác định Hoạt động trong dự án thử nghiệm Android và chạy thử nghiệm không?

hoạt động thử nghiệm được thêm vào file manifest và gói dường như được thiết lập một cách chính xác.

Tôi đã cố gắng để đặt nó trong cả com.xxx (gói của ứng dụng) và các gói com.xxx.test, không có may mắn. Nhưng khi tôi di chuyển TestActivity vào ứng dụng đích, mọi thứ đều hoạt động tốt. Vì vậy, tôi bắt đầu tự hỏi sự khác biệt giữa dự án thử nghiệm và ứng dụng của tôi là gì và thậm chí có thể có các hoạt động bên trong các dự án thử nghiệm.

Trả lời

9

Vâng, đó là có thể nhưng không được khuyến khích, vì nó được ghi trong official dev guide:

Một khi bạn đã tạo ra một dự án thử nghiệm, bạn điền nó với một gói thử nghiệm. Gói này không yêu cầu Hoạt động, mặc dù bạn có thể xác định một gói nếu muốn. Mặc dù gói thử nghiệm của bạn có thể kết hợp các lớp Activity, các lớp test case hoặc các lớp thông thường, trường hợp test chính của bạn sẽ mở rộng một trong các lớp test Android hoặc các lớp JUnit, vì chúng cung cấp các tính năng thử nghiệm tốt nhất.

Để làm được điều này, bạn cần:

  1. Xác định hoạt động giả của bạn trong AndroidManifest.xml của dự án thử nghiệm.
  2. Thay đổi quan điểm thiết bị đo đạc targetPackage cho chính nó trong AndroidManifest.xml thử nghiệm dự án. (lớp Hoạt động được kiểm tra phải trong mục tiêu cụ thểĐóng gói).

Giả sử tôi có một dự án thử nghiệm com.example.test chứa hai lớp DummyActivity và DummyActivityTest, sau đó nếu bạn muốn thử nghiệm DummyActivity sử dụng DummyActivityTest, bạn cần xác định AndroidManifest.xml Dự án thử nghiệm của bạn như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="10" /> 

<!-- targetPackage point to test project itself --> 
<instrumentation 
    android:name="android.test.InstrumentationTestRunner" 
    android:targetPackage="com.example.test" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <uses-library android:name="android.test.runner" /> 
    <activity 
     android:name=".DummyActivity" 
     android:label="@string/app_name" > 
    </activity> 
</application> 

+0

Khi tôi thay đổi targetPackage tự , nó bắt đầu thất bại với NoSuchMethodException tại InstrumentationTestRunner.onCreate – basin

+0

tôi đã gặp rắc rối với phương pháp này; Tôi nghĩ rằng nếu gói/manifest/@ giống như/manifest/instrumentation/@ android: targetPackage thì các bài kiểm tra sẽ thay thế hiệu quả ứng dụng đang kiểm tra, làm cho nó không thể tham chiếu các lớp của nó. Tôi đã nhận được ClassNotFoundExceptions. –

+1

Tôi nhận được nó làm việc với phương pháp này bằng cách thêm một AndroidManifest.xml bổ sung trong thư mục androidTest. Nhưng với phiên bản Android Studio mới hơn, kể từ 2.3.1I hiện đang sử dụng, phần tử '' là không cần thiết. –

0

Dự án thử nghiệm và hoạt động thể cùng tồn tại với nhau, đặt tên gói mục tiêu như tên gói các dự án thử nghiệm của

+0

Cảm ơn bạn đã trả lời. Tôi đã thử như bạn đề xuất, nhưng bây giờ tôi nhận được java.lang.RuntimeException: Ngoại lệ trong bộ xây dựng tại android.test.suitebuilder.TestSuiteBuilder $ FailedToCreateTests.testSuiteConstructionFailed (TestSuiteBuilder.java:239) – Fedor

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