AndroidJUnit4.class เลิกใช้แล้ว: วิธีใช้ androidx.test.ext.junit.runners.AndroidJUnit4


255

สำหรับการทดสอบเครื่องมือของฉันฉันใช้

@RunWith(AndroidJUnit4.class)

จาก

import androidx.test.runner.AndroidJUnit4;

เพื่อสร้างกรณีทดสอบของฉัน ตอนนี้สายนี้ได้รับการทำเครื่องหมายว่าเลิกกับคำใบ้ที่จะใช้AndroidJUnit4จาก

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

อย่างไรก็ตามถ้าฉันพยายามที่จะนำเข้าAndroidJUnit4จากแพคเกจที่มีชื่อฉันได้รับข้อผิดพลาดที่extไม่สามารถแก้ไขได้

คุณมีความคิดว่าควรรวมแพ็คเกจใดในการไล่ระดับสีเพื่อแก้ไขปัญหานี้



4
ฉันคิดว่าแหล่งที่มาของคุณล้าสมัยพวกเขาไม่ได้พูดถึง androidx เลย
Marcel Gangwisch

1
การทดสอบหน่วยบน Android เป็นระเบียบมากที่สุดของข้อบกพร่องและการคัดค้าน สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือการสร้างโครงการเริ่มต้นใหม่คัดลอกไฟล์ที่เกี่ยวข้องจากโครงการนั้นเป็นของฉันสลับไปยังโหมดแก้ไขข้อบกพร่องและทำการตรวจสอบแคชแบบเต็มรูปแบบ นอกจากนี้สำหรับ AndroidJUnit4 ทดสอบชื่อแพคเกจจะต้องตรงกับชื่อแพคเกจห้องสมุด
Rupert Rawnsley

คำตอบ:


377

ตามเอกสารสำหรับ AndroidJUnit4 ,

  1. ไฟล์ gradle ควรมีบรรทัดต่อไปนี้: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. เปลี่ยนคลาสทดสอบเป็นAndroidJUnit4ClassRunnerจากAndroidJUnit4

หากยังใช้งานไม่ได้ให้ตรวจสอบให้แน่ใจว่าคุณล้างและ / หรือสร้างโครงการใหม่ นอกจากนี้คุณสามารถตรวจสอบเวอร์ชันปัจจุบันโดยตรงในที่เก็บ maven ของ Google


20
gradle ของฉันมีสิ่งนี้และยังไม่สามารถแก้ไขปัญหาได้
zuko

@zuko ทำความสะอาดและ / หรือสร้างโครงการของคุณใหม่ควรจะอยู่ที่นั่น หากยังไม่ได้และคุณกำลังใช้โมดูลตรวจสอบว่าลำดับชั้นการพึ่งพาของคุณมีการตั้งค่าตามที่คุณคาดหวัง; คุณอาจต้องเพิ่มสิ่งเหล่านี้ไปยังโมดูลระดับบนสุดเช่นกันเนื่องจากการทดสอบไลบรารีไม่ได้รวบรวมไว้ในโมดูลที่ใช้ร่วมกันเพื่อใช้งานโดยโมดูลอัปสตรีม
Jon Adams

@ จอนอดัมส์แผนภูมิการพึ่งพาของฉันยังคงอ้างอิงถึงไลบรารีเก่า ๆ ด้วยเหตุผลบางอย่างแม้ว่าฉันคิดว่าฉันลบมันออก ดังนั้นหลังจากลองทำสิ่งต่าง ๆ ฉันก็แค่ย้ายโครงการไปที่ใหม่และทุกอย่างก็โอเคแล้ว
zuko

7
เราควรเปลี่ยนtestInstrumentationRunnerในไฟล์gradleจากandroidx.test.runner.AndroidJUnitRunnerเป็นandroidx.test.ext.junit.runners.AndroidJUnit4หรือไม่ เพียงแค่สงสัยว่ามีความไม่ตรงกันหรือไม่
Droid

22
@A Droid แทนที่แพ็กเกจ AndroidJUnit4 เก่า ๆ ด้วยการนำเข้าใหม่ เพียงแค่แทนที่การนำเข้า androidx.test.runner.AndroidJUnit4; ด้วยการนำเข้า androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive

27

หากคุณลองใช้วิธีการแก้ปัญหาของ @ MarcelGangwisch แล้วและงานสร้างของคุณล้มเหลวโดยบอกว่าไม่สามารถหาทรัพยากรได้และคุณได้ทำความสะอาด / สร้างโครงการของคุณใหม่และมันยังไม่ทำงานลองทำสิ่งนี้: (อิงตามโซลูชันของ @ KrzysztofDziuba ด้วย)

ในไฟล์ gradle ที่คุณเปลี่ยนการพึ่งพาตรวจสอบให้แน่ใจว่าคุณเพิ่มมันเป็นประเภทที่คุณต้องการเช่น:

สำหรับการทดสอบ UI:

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

สำหรับการทดสอบหน่วย:

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

ในอินสแตนซ์ของฉันฉันเพิ่มมันเป็นทั้งสองและตอนนี้มันใช้งานได้


13

สารละลาย

  1. เพิ่มบรรทัดนี้ใน build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. เปลี่ยนAndroidJUnit4เป็นAndroidJUnit4ClassRunnerในคลาสทดสอบ

คำเตือน

ฉันได้รับข้อผิดพลาดเดียวกัน แต่วิธีแก้ไขปัญหาต่อไปนี้ล้มเหลวสำหรับฉัน:

ไฟล์ -> ทำให้แคชไม่ถูกต้อง ... และเลือกทำให้ใช้ไม่ได้และเริ่มต้นใหม่


12

สำหรับผมขั้นตอนต่อไปการทำงาน:
1. แทนที่ห้องสมุด androidx กับคนที่โพสต์ที่นี่ สุดท้ายของฉันapp/build.gradleดูเหมือนว่านี้:

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'

}

ฉันแทนที่โมดูลที่อิมพอร์ตด้วยตนเองในExampleInstrumentTest.javaคลาสของฉันด้วยคลาสล่าสุด:

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");
    }
}

สิ่งที่ดักฟังฉันคือความจริงที่ว่าInstrumentationRegisteryชั้นเรียนยังคงเลิกใช้ ดังนั้นฉันใช้InstrumentationRegistry.getInstrumentation().getTargetContext();จากandroidx.test.platform.app.InstrumentationRegistryชั้นเรียน


3
@RunWith(AndroidJUnit4ClassRunner.class)เป็นส่วนที่ได้รับการแก้ไขปัญหาในกรณีของฉัน ฉันไม่เข้าใจว่าทำไมบางครั้ง android studio สร้างรหัสที่เลิกใช้แล้ว
Rafsanjani

ใช้ApllicationProvider.getApplicationContext<Context>()แทนInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch

7

ฉันพยายามทั้งหมดดังกล่าวข้างต้นจนกว่าฉันจะเดินไปที่เว็บไซต์อย่างเป็นทางการของ Android และพวกเขานำเข้าจากปัญหาแทนandroidx.test.ext.junit.runners.AndroidJUnit4 ลิงค์androidx.test.runner.AndroidJUnit4



0

หากคุณนำเข้าไลบรารีทดสอบ AnroidX เหล่านั้นให้ซิงค์และสร้างโครงการขึ้นใหม่ แต่แพคเกจที่นำเข้ายังคงไม่ได้รับการแก้ไข เพียงจำไว้ว่าคุณอัพเกรดโครงการเป็น AndroidX อย่างไรให้ปิด Android Studio และนำ.ideaโฟลเดอร์ออกแล้วเปิดโครงการอีกครั้ง ...

สิ่งนี้ได้ผลสำหรับฉัน!


0
  1. รวมบรรทัดเหล่านี้ในโมดูลแอพ build.gradle

    testImplementation 'androidx.test.ext: junit: 1.1.1' androidTestImplementation 'androidx.test.ext: junit: 1.1.1'

  2. ในชั้นเรียนทดสอบให้เปลี่ยนนักวิ่งทดสอบของคุณเป็น

    นำเข้า androidx.test.ext.junit.runners.AndroidJUnit4;

  3. หากInstrumentationRegistry.getTargetContext()คือการใช้ที่เลิกInstrumentationRegistryจากการandroidx.test.platform.appเช่นนี้

    InstrumentationRegistry.getInstrumentation (). getTargetContext ()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.