2015-08-07 11 views
5

tôi đã thêm các phụ thuộc sau đây để dự án Android của tôi:Bắt junit.framework.AssertionFailedError: Không có xét nghiệm tìm thấy trong [gói] khi sử dụng Unit và Mockito

// Unit testing dependencies 
androidTestCompile 'junit:junit:4.12' 
// Set this dependency if you want to use Mockito 
androidTestCompile 'org.mockito:mockito-core:1.10.19' 

Và tạo ra một thử nghiệm sử dụng api Junit4 (một ví dụ, adder là một lớp đơn giản mà tổng ints):

@RunWith(MockitoJUnitRunner.class) 
public class AdderTest { 

    @Test 
    public void testValidAdd() { 
     Adder adder = new Adder(); 
     assertEquals(adder.add(1,1), 2); 
    } 
} 

Khi tôi cố gắng chạy thử nghiệm, tôi nhận được:

Running tests Test running started junit.framework.AssertionFailedError: No tests found in com.test.myapp.AdderTest at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) Finish

Tôi đã đọc herehere, nhưng không có gì hữu ích.

Có ai nhìn thấy những gì tôi đang làm sai/có bất kỳ đầu vào nào không?

+0

Bài kiểm tra đơn vị thuộc về thư mục 'test', vì vậy hãy sử dụng' testCompile'. Ngoài ra, bạn không cần '@RunWith (MockitoJUnitRunner.class)'. –

+0

Đây chỉ là một ví dụ. Tôi cần trong dự án ban đầu của tôi để sử dụng mocks. Ngoài ra, mã mà tôi đang thử nghiệm sử dụng android.util.Patterns.EMAIL_ADDRESS và mã trả về null khi tôi chạy nó dưới dạng kiểm tra đơn vị. Nếu tôi chạy nó như là một thử nghiệm thiết bị Android, nó sẽ không trả lại sự phù hợp thực tế? – dors

+0

Đăng mã của bạn để rõ ràng. Bạn nên sử dụng Robolectric để kiểm tra đơn vị.Nó sẽ cụ các lớp bạn cần để bạn không cần mocks * cho mọi thứ *. –

Trả lời

2

Bạn đang sử dụng thử nghiệm Thiết bị Android. Theo mặc định, nhân viên thử nghiệm Android không chạy trên JUnit4, nó chạy trên JUnit3 sử dụng các lớp con của InstrumentationTestCase.

Bạn sẽ cần phải hoàn nguyên về các cuộc gọi thủ công đến MockitoAnnotations.initMocks(), với cuộc gọi đổ xuống tùy chọn tới Mockito.validateMockitoUsage(). Tất nhiên, các cuộc gọi trực tiếp đến Mockito.mock (và như vậy) sẽ vẫn hoạt động.

Thay vào đó, có một official JUnit4 runner, có thể được cài đặt từ Android Support Test Library. Bằng cách gọi Instrumentation này chứ không phải là runner thử nghiệm mặc định, bạn có thể chạy các kiểm tra JUnit4 trên thiết bị của mình, bao gồm sử dụng MockitoJUnitRunner hoặc MockitoRule.

+0

Trên thực tế, Á hậu mặc định cho các dự án Android hiện đại là Junit 4 bây giờ. –

+1

@IgorGanapolsky Chắc chắn, nhưng chỉ khi bạn đặt Á hậu thử nghiệm thiết bị như câu trả lời của Szymon. Á hậu tích hợp là JUnit3.8, do đó cần ghi đè lên; một khi nó được ghi đè, bạn đang sử dụng Thư viện kiểm tra hỗ trợ Android như trong câu trả lời của tôi. –

16

Đây không phải là các bài kiểm tra đơn vị, chúng là thử nghiệm thiết bị đo đạc. Tôi đã cùng một vấn đề và giải quyết nó bằng cách thêm các dòng để build.gradle mô-đun của:

android { 
    ... 
    sourceSets { 
     ... 
     defaultConfig { 
      testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' 
     } 
    } 
} 

Bạn phải thêm Á hậu tại phụ thuộc, tôi đề nghị bạn espresso:

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 

EDIT:

Tôi đã quên chú thích. Chỉ cần loại bỏ @RunWith và thực hiện một phương pháp @Before với dòng:

MockitoAnnotations.initMocks(this); 

hay:

System.setProperty("dexmaker.dexcache", InstrumentationRegistry.getTargetContext().getCacheDir().getPath()); 

tôi phải đề cập đến cách này không được khuyến khích. Để sử dụng điều thứ hai, bạn phải thêm phụ thuộc với dex-nhà sản xuất cho Mockito:

androidTestCompile ('com.google.dexmaker:dexmaker-mockito:1.2') { 
     exclude module: 'mockito-core' 
    } 

Vì bạn đã thêm Mockito, chúng ta phải loại trừ lõi Mockito từ phụ thuộc mới. Nó đã chứa mô-đun dex-maker bình thường.

+1

@IgorGanapolsky Dòng bạn đang tìm kiếm nằm trong [app/build.gradle] (https://github.com/googlesamples/android-topeka/blob/master/app/build.gradle#L29). Điều này dường như hỗ trợ câu lệnh rằng chỉ thị 'testInstrumentationRunner' là bắt buộc. –

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