AndroidJUnit4. Class không được dùng nữa: Làm thế nào để sử dụng androidx.test.ext.junit.runners.AndroidJUnit4?


255

Đối với các bài kiểm tra thiết bị của tôi, tôi đã sử dụng

@RunWith(AndroidJUnit4.class)

từ

import androidx.test.runner.AndroidJUnit4;

để thiết lập trường hợp thử nghiệm của tôi. Bây giờ dòng này được đánh dấu là không dùng với gợi ý để sử dụng AndroidJUnit4từ

import androidx.test.ext.junit.runners.AndroidJUnit4

Tuy nhiên, nếu tôi cố gắng nhập AndroidJUnit4từ gói được đặt tên, tôi gặp lỗi, điều đó extkhông thể được giải quyết.

Bạn có một ý tưởng, gói nào nên được bao gồm trong lớp để giải quyết vấn đề này?



4
Tôi nghĩ rằng nguồn của bạn là vô hình, họ không đề cập đến androidx.
Marcel Gangwisch

1
Kiểm thử đơn vị trên Android là một mớ hỗn độn về lỗi và sự phản đối. Điều duy nhất phù hợp với tôi là tạo một dự án cào mới, sao chép các tệp có liên quan từ dự án đó sang tôi, chuyển sang chế độ gỡ lỗi và thực hiện vô hiệu hóa bộ đệm đầy đủ. Ngoài ra đối với các bài kiểm tra AndroidJUnit4, tên gói phải khớp với tên gói thư viện.
Rupert Rawnsley

Câu trả lời:


377

Theo tài liệu cho AndroidJUnit4 ,

  1. Tệp gradle nên chứa dòng sau: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Thay đổi lớp kiểm tra thành AndroidJUnit4ClassRunnertừAndroidJUnit4

Nếu nó vẫn không hoạt động, hãy đảm bảo rằng bạn dọn dẹp và / hoặc xây dựng lại dự án của bạn. Ngoài ra, bạn có thể kiểm tra phiên bản hiện tại trực tiếp trong kho lưu trữ maven của Google


20
học sinh lớp của tôi có điều này và vẫn không thể giải quyết vấn đề.
zuko

@zuko Làm sạch và / hoặc xây dựng lại dự án của bạn, nó sẽ ở đó. Nếu vẫn không và bạn đang sử dụng các mô-đun, hãy kiểm tra xem hệ thống phân cấp phụ thuộc của bạn có được thiết lập như bạn mong đợi không; bạn cũng có thể cần phải thêm chúng vào các mô-đun cấp cao nhất vì các thư viện kiểm tra không được biên dịch thành các mô-đun dùng chung để sử dụng cho các mô-đun ngược dòng.
Jon Adams

@JonAdams Cây phụ thuộc của tôi tiếp tục giữ một tham chiếu đến các thư viện cũ hơn vì một số lý do mặc dù tôi nghĩ rằng tôi đã xóa chúng. Vì vậy, sau khi thử nhiều thứ, cuối cùng tôi đã chuyển dự án sang một dự án mới và mọi thứ đều ổn.
zuko

7
Chúng ta cũng nên thay đổi testInstrumentationRunner trong tệp gradle từ androidx.test.runner.AndroidJUnitRunner thành androidx.test.ext.junit.runners.AndroidJUnit4 ? Chỉ tự hỏi nếu có một sự không phù hợp.
Một Droid

22
@A Droid Thay thế gói AndroidJUnit4 cũ trong nhập khẩu bằng gói mới. Chỉ cần thay thế nhập androidx.test.runner.AndroidJUnit4; với nhập androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive

27

Nếu bạn đã thử giải pháp của @ MarcelGangwisch và bản dựng của bạn không nói rằng nó không thể tìm thấy tài nguyên VÀ bạn cũng đã làm sạch / xây dựng lại dự án của mình và nó vẫn không hoạt động, hãy thử điều này: (cũng dựa trên giải pháp của @ KrzysztofDziuba)

Trong tệp lớp của bạn nơi bạn đã thay đổi phụ thuộc, hãy đảm bảo bạn đang thêm nó dưới dạng loại bạn cần, tức là:

Đối với các bài kiểm tra UI:

androidTestImcellenceation 'androidx.test.ext: junit: 1.1.0'

Đối với bài kiểm tra Đơn vị:

testImcellenceation 'androidx.test.ext: junit: 1.1.0'

Trong ví dụ của tôi, tôi đã thêm nó vào cả hai và bây giờ nó hoạt động.


13

Giải pháp

  1. Thêm dòng này vào build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Thay đổi AndroidJUnit4để AndroidJUnit4ClassRunnertrong lớp thử nghiệm

Cảnh báo

Tôi đã gặp lỗi tương tự, nhưng giải pháp sau đây đã thất bại với tôi:

Tệp -> Bộ đệm không hợp lệ ... và chọn Không hợp lệ và khởi động lại


12

Đối với tôi, các bước sau đây đã hoạt động:
1. Thay thế các thư viện androidx bằng thư viện được đăng ở đây . trận chung kết của tôi app/build.gradletrông như thế này:

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    ...
    testImplementation 'junit:junit:4.12'

    // Core library
    androidTestImplementation 'androidx.test:core:1.2.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.ext:truth:1.2.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

    // Espresso dependencies
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

Sau đó, tôi đã thay thế thủ công các mô-đun đã nhập trong ExampleInstrumentTest.javalớp của mình bằng các lớp mới nhất:

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleInstrumentedTest {
    ...
    @Rule
    public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class, true);

    @Before
    public void init() {
        ...
    }
    @Test
    public void listCount() {
        ...
    }

    @Test
    public void useAppContext() {
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        Assert.assertEquals("in.curioustools.aad_x_testing2", appContext.getPackageName());
        System.out.println("useAppContext : Test Ran");
    }
}

Điều làm tôi khó chịu là thực tế là InstrumentationRegisterylớp học vẫn không được chấp nhận. Vì vậy, tôi đã sử dụng InstrumentationRegistry.getInstrumentation().getTargetContext();từ androidx.test.platform.app.InstrumentationRegistrylớp học.


3
@RunWith(AndroidJUnit4ClassRunner.class)là phần giải quyết vấn đề trong trường hợp của tôi. Tôi thực sự không hiểu tại sao studio android tạo mã không dùng nữa.
Rafsanć

Sử dụng ApllicationProvider.getApplicationContext<Context>()thay vìInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch

7

Tôi đã thử tất cả những gì được đưa ra ở trên cho đến khi tôi đi đến trang web chính thức của Android và họ đề nghị nhập từ androidx.test.ext.junit.runners.AndroidJUnit4thay vì androidx.test.runner.AndroidJUnit4. liên kết



0

Nếu bạn đã nhập các thư viện kiểm tra AnroidX đó, đã đồng bộ hóa và xây dựng lại dự án, nhưng các gói đã nhập vẫn không được giải quyết. Chỉ cần nhớ cách bạn nâng cấp dự án của mình lên AndroidX, đóng Android Studio và xóa .ideathư mục và mở lại dự án của bạn ...

Điều này làm việc cho tôi!


0
  1. Bao gồm các dòng này trong mô-đun ứng dụng build.gradle.

    testImcellenceation 'androidx.test.ext: junit: 1.1.1' androidTestImcellenceation 'androidx.test.ext: junit: 1.1.1'

  2. Trong lớp kiểm tra thay thế người chạy thử của bạn để

    nhập androidx.test.ext.junit.runners.AndroidJUnit4;

  3. Nếu InstrumentationRegistry.getTargetContext()không được sử dụng InstrumentationRegistrytừandroidx.test.platform.app như thế này

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.