launchFragmentInContainer kann Aktivität in Android nicht auflösen

Lesezeit: 5 Minuten

Beim Schreiben eines einfachen Tests, der verwendet launchFragmentInContainererhalte ich folgende Fehlermeldung:

java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myapp.appname.debug/androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }

Die grundlegende Testklasse ist:

class OneFragmentTest {

    @Test
    fun testOneFragmentState_checkTitleText() {
        val args = Bundle().apply {
            putString("dummyKey", "dummyValue")
        }
        launchFragmentInContainer<OneFragment>(args)

        onView(withId(R.id.tv_title)).check(matches(withText("title here")))
    }
}

Ich habe versucht zu aktualisieren AndroidManifest.xml mit den folgenden:

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.myapp.appname" />

aber es scheint, dass das Tag instrumentation ist gültig, aber die Werte sind rot geschrieben, also nehme ich an, dass etwas mit dem nicht stimmt targetPackage Und name.

Wie kann ich diesen Fehler beseitigen und einen einfachen Test mit OneFragment durchführen? launchFragmentInContainer?

  • Warum brauchten Sie die <instrumentation> -Tag im AndroidManifest? Google hat nie gesagt, es zu verwenden.

    – IgorGanapolsky

    21. Oktober 2020 um 15:40 Uhr


Benutzeravatar von Bugdr0id
Bugdr0id

Der Fehler hing mit der Art und Weise zusammen, wie ich die Abhängigkeiten in Gradle importiert habe.

Vor:

androidTestImplementation("androidx.fragment:fragment-testing:1.1.0-beta01")
implementation("androidx.fragment:fragment-ktx:1.1.0-beta01")
androidTestImplementation("androidx.test:core:1.2.0")
androidTestImplementation("androidx.test:rules:1.2.0")
androidTestImplementation("androidx.test:runner:1.2.0")

Nach:

debugImplementation("androidx.fragment:fragment-testing:1.1.0-beta01")
debugImplementation("androidx.fragment:fragment-ktx:1.1.0-beta01")
debugImplementation("androidx.test:core:1.2.0")
debugImplementation("androidx.test:rules:1.2.0")
debugImplementation("androidx.test:runner:1.2.0")

Gewechselt von androidTestImplementation Zu debugImplementation und es löste das Problem. Kompilieren und Ausführen und grüner Test als Ergebnis.

  • Schön, dass du eine Lösung gefunden hast, aber developer.android.com/training/testing/set-up-project Wie kommt es, dass es für sie funktioniert?

    – Astha Garg

    13. Juni 2019 um 7:03 Uhr


  • Sie können debugImplementation verwenden, damit es nicht in Ihre Release-Builds integriert wird

    – Basautner

    5. August 2019 um 16:57 Uhr

  • Satz debugImplementation für fragment-testing sollte ausreichen, verbleibende Testabhängigkeiten können als `androidTestImplementation

    – Karol Kulbaka

    19. März 2020 um 17:40 Uhr

  • warum müssen wir uns ändern debugImplementation ?

    – amlwin

    11. August 2020 um 5:31 Uhr

  • Das macht keinen Sinn. Alle Espresso-Tests gehen hinein androidTestImplementation

    – IgorGanapolsky

    21. Oktober 2020 um 15:41 Uhr

Versuchen Sie, auf diese Weise zu konfigurieren

debugImplementation('androidx.fragment:fragment-testing:1.1.0') {
        // exclude androidx.test:core while fragment_testing depends on 1.1.0
        exclude group: 'androidx.test', module: 'core'
    }

  • Nachdem ich androidTestImplementation in debugImplementation geändert hatte, bekam ich Fehler in meinem Manifest, dass ich kein ‘exportiertes’ Feld habe und es in Android 12 und höher benötigt wird, was ich in meinem Manifest hatte und es hat sich immer wieder beschwert, aber diese Antwort hat das Problem gelöst.

    – Bita Mirshafiee

    23. November 2021 um 12:39 Uhr

Für mich geht das

def fragmentx_version = "1.1.0"
implementation "androidx.fragment:fragment:$fragmentx_version"
debugImplementation ("androidx.fragment:fragment-testing:$fragmentx_version"){
     exclude group: 'androidx.test', module: 'core'
}
debugImplementation 'androidx.test:core-ktx:1.2.0'

@Test
fun verifyMap() {
     FragmentScenario.launchInContainer(HomeFragment::class.java)

     onView(withId(R.id.map)).check(matches(isDisplayed()))
}

  • Warum nicht androidTestImplementation?

    – IgorGanapolsky

    21. Oktober 2020 um 15:41 Uhr

Benutzeravatar von Rakhi Dhavale
Rakhi Dhavale

Ich habe die Testbeispiele für Espresso verwiesen und die folgenden Abhängigkeiten in der build.gradle-Datei auf App-Ebene verwendet

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:' + rootProject.androidxCompatVersion
implementation 'androidx.core:core-ktx:' + rootProject.androidxCoreVersion
implementation 'androidx.fragment:fragment-ktx:' + rootProject.androidxFragmentVersion

// Ideally this would only be present in test scope (Adding this fixed the issue for me)
debugImplementation 'androidx.fragment:fragment-testing:' + rootProject.androidxFragmentVersion
debugImplementation 'androidx.test:core:' + rootProject.coreVersion

testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:' + rootProject.robolectricVersion
testImplementation 'androidx.test:core:' + rootProject.coreVersion
testImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
testImplementation 'androidx.test.espresso:espresso-core:' + rootProject.espressoVersion
testAnnotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'

androidTestImplementation 'androidx.test:core:' + rootProject.coreVersion
androidTestImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
androidTestImplementation 'androidx.test:runner:' + rootProject.runnerVersion
androidTestImplementation 'androidx.test.espresso:espresso-core:' + rootProject.espressoVersion
androidTestImplementation 'androidx.fragment:fragment-testing:' + rootProject.androidxFragmentVersion
androidTestImplementation 'org.robolectric:annotations:' + rootProject.robolectricVersion     }

Innerhalb Ihrer build.gradle-Datei auf Projektebene

ext {
buildToolsVersion = "28.0.3"
androidxCoreVersion = "1.1.0-rc02"
androidxCompatVersion = "1.1.0-rc01"
androidxFragmentVersion = "1.1.0-rc01"
coreVersion = "1.3.0-alpha03"
extJUnitVersion = "1.1.2-alpha03"
runnerVersion = "1.3.0-alpha03"
rulesVersion = "1.3.0-alpha03"
espressoVersion = "3.3.0-alpha03"
robolectricVersion = "4.3.1"   }

Innerhalb der Testklasse für isolierte Fragmente

@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
class ExampleFragmentTest{
@Test
fun launchFragmentAndVerifyTheUI(){
   /* This is used to launch the fragment in an isolated environment ( This is essentially an empty activity that
   houses that fragment ) */
   launchFragmentInContainer<ExampleFragment>()
    // Now using Espresso to verify the fragment's UI, i.e textview and verifying that its getting displayed
    onView(withId(R.id.textView)).check(matches(withText("I am a fragment")))
}  }

Benutzeravatar von qkx
qkx

Die akzeptierte Antwort ist (fast) richtig – ich werde nur erklären, warum.

Sie müssen sich also zuerst ändern androidTestImplementation Zu debugImplementation aber nur für diese 2 Abhängigkeiten unten (nicht alle):

androidx.fragment:fragment-testing
androidx.test:core

Und der Grund? Ursache ist ein alter Bug (seit 2020 schon) in FragmentScenario hier berichtet.

Google selbst empfiehlt in eigenen Codelabs nicht zu verwenden androidTestImplementation für Fragmenttest-Abhängigkeit, mehr Details hier:

https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-test-doubles#7

Zitieren des wichtigen Teils:

// Testing code should not be included in the main code.
// Once https://issuetracker.google.com/128612536 is fixed this can be fixed.

implementation "androidx.fragment:fragment-testing:$fragmentVersion"
implementation "androidx.test:core:$androidXTestCoreVersion"

Außer im Idealfall sollte es sein debugImplementation und nicht implementation

Benutzeravatar von Homan Huang
Homan Huang

Ich habe den gleichen Fehler mit HiltTestActivity.kt bekommen, weil ich die AndroidManifest.xml parallel zur Aktivitätsdatei eingefügt habe.

Meine Lösung: Verschieben Sie die AndroidManifest.xml in den Java-Ordner.

Benutzeravatar von Tivo Yudha P
Tivo Yudha P

Ich habe auch den gleichen Fehler. Aber in meinem Fall habe ich vergessen, HiltTestActivity.kt in AndroidManifest.xml hinzuzufügen.

<activity android:name=".support.view.HiltTestActivity" />

Und das ist meine launchFragmentToContainer-Funktion.

inline fun <reified T : Fragment> launchFragmentToContainer(
    fragmentArgs: Bundle? = null,
    themeResId: Int,
    fragmentFactory: FragmentFactory? = null,
    crossinline action: T.() -> Unit = {}
) {
    val mainActivityIntent = Intent.makeMainActivity(
        ComponentName(
            ApplicationProvider.getApplicationContext(),
            HiltTestActivity::class.java
        )
    ).putExtra(THEME_EXTRAS_BUNDLE_KEY, themeResId)
    ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
        fragmentFactory?.let {
            activity.supportFragmentManager.fragmentFactory = it
        }
        val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
            checkNotNull(T::class.java.classLoader),
            T::class.java.name
        )
        fragment.arguments = fragmentArgs
        activity.supportFragmentManager.beginTransaction()
            .add(android.R.id.content, fragment, "")
            .commitNow()
        (fragment as T).action()
    }
}

1442980cookie-checklaunchFragmentInContainer kann Aktivität in Android nicht auflösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy