簡體   English   中英

JUnit 5 用於 Android 測試

[英]JUnit 5 for Android testing

Android單元測試如何配置JUnit 5? 我試過了:

testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0")

但它不起作用,當我運行之前最簡單的單元測試時:

@Test
public void addition_isCorrect() throws Exception {
    assertEquals(4, 2 + 2);
}

我收到錯誤:

Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader()Ljava/lang/ClassLoader;
    at org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry.loadTestEngines(ServiceLoaderTestEngineRegistry.java:31)
    at org.junit.platform.launcher.core.LauncherFactory.create(LauncherFactory.java:42)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:36)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1
Empty test suite.

請參閱問題和有關 Android 上的 JUnit 5 支持的問題。

在您的頂級build.gradle[.kts]文件中添加此構建腳本依賴項:

buildscript {
  dependencies {
    classpath("de.mannodermaus.gradle.plugins:android-junit5:1.8.2.0")
  }
}

並將這些行添加到您的應用程序或庫build.gradle[.kts]文件中:

plugins {
  // ...
  id("de.mannodermaus.android-junit5")
}

dependencies {
  // Aggregator dependency on JUnit api, engine, and params
  testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
  // (Optional) If you also have JUnit 4-based tests
  testImplementation("junit:junit:4.13.2")
  testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
}

如果您使用的是Android Gradle 插件 3.2.0 或更高版本Gradle 4.7 或更高版本,則可以使用上述解決方案。 有關更多信息,請參閱插件 GitHub 頁面

擴展答案

如果您想在您的儀器測試( androidTest源集)中使用 JUnit 5,請執行以下操作:

  1. 將這些依賴項添加到您的應用程序或 libray 構建腳本中:
androidTestImplementation("de.mannodermaus.junit5:android-test-core:1.3.0")
androidTestRuntimeOnly("de.mannodermaus.junit5:android-test-runner:1.3.0")
  1. 在測試類中使用ActivityScenarioExtension而不是ActivityScenarioRule
import de.mannodermaus.junit5.ActivityScenarioExtension

class MyActivityTest {

  @JvmField
  @RegisterExtension
  val scenarioExtension = ActivityScenarioExtension.launch<MyActivity>()

  @Test
  fun test1() {
    val scenario = scenarioExtension.scenario
    scenario.moveToState(Lifecycle.State.RESUMED)
    assertThat(scenario.state).isEqualTo(Lifecycle.State.RESUMED)
  }

  @Test
  fun test2(scenario: ActivityScenario<MyActivity>) {
    scenario.moveToState(Lifecycle.State.RESUMED)
    assertThat(scenario.state).isEqualTo(Lifecycle.State.RESUMED)
  }
}

Android Studio 是基於 IDEA 的,對嗎?

然后在此處查看此答案https://stackoverflow.com/a/46161799/1431016或直接閱讀http://junit.org/junit5/docs/current/user-guide/#running-tests-ide上的用戶指南-intellij-idea

概括:

// Only needed to run tests in an IntelliJ IDEA that bundles an older version
testImplementation("org.junit.platform:junit-platform-launcher:1.0.0")
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.0.0")
testImplementation("org.junit.vintage:junit-vintage-engine:4.12.0")

我還沒有嘗試過這個項目,但它可以幫助您在 Android 上使用 JUnit 5: https ://github.com/aurae/android-junit5

始終使用官方版本

首先去這里的 Junit官方文檔https ://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api 你會看到像這樣的所有最新版本在此處輸入圖像描述

然后在你的 app/gradle 添加這個依賴:

testImplementation('org.junit.jupiter:junit-jupiter:XXX')

其中 XXX 是您想要的版本。 例如在我的情況下

testImplementation('org.junit.jupiter:junit-jupiter:5.6.0')

您可以通過將這些行添加到您的 gradle 文件來使用官方版本:

android {
    testOptions {
        unitTests.all {
            useJUnitPlatform()
    }
  }
}



dependencies {
     testImplementation "org.junit.jupiter:junit-jupiter:5.8.0"
}

要繼續與 Junit5 一起運行 JUnit4 測試,請添加:

testImplementation "org.junit.vintage:junit-vintage-engine:5.8.0"

現在是 2023 年 1 月,這里的答案曾經有效,但不適用於運行 Gradle 7.4 的 Android Studio 2021.3.1(補丁 1)。

這就是我為使我的工作所做的:

  1. 首先,嘗試遵循@Mahozad 的回答。 我選擇它是因為它引用了最新的 junit-jupiter:5.9.1 版本
  2. 但是我的應用程序build.gradle不喜歡那里的plugins {...}部分,所以我使用了@BoonKeatTeo 文章中的apply plugin: 'de.mannodermaus.android-junit5'
  3. 盡管如此,它還是無法識別任何導入的符號,因此我從@DagnogoJean-François 的回答中添加了存儲庫 URL (文件 > 設置 > 構建... > 遠程 Jar 存儲庫)
  4. 它繼續抱怨import static org.junit.jupiter.api.Assertions.*; 添加到測試 class 並從命令行gradlew build --warning-mode=all運行后,我意識到刪除已棄用JCenter存儲庫是個好主意。
  5. 我仍然有導入警告,所以我決定刪除所有導入並接受 Android Studio 的建議以添加org.junit.jupiter:junit-jupiter:5.8.1依賴項。 這似乎已經產生了魔力,現在我的任何測試 class 符號上都沒有警告。

總而言之,這是我的 build.gradle 現在的樣子:

apply plugin: 'com.android.library'
apply plugin: 'de.mannodermaus.android-junit5'

android {
    compileSdkVersion 33
    buildToolsVersion "33.0.1"
    compileOptions.encoding = 'windows-1251'
    useLibrary 'org.apache.http.legacy'
    namespace 'com.susu.mylib'

    defaultConfig {
        minSdkVersion 26
        targetSdkVersion 33
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard.cfg'
        }
    }

    testOptions {
        unitTests.all {
            useJUnitPlatform()
        }
    }
}

dependencies {
    implementation "androidx.core:core-ktx:1.9.0"
    implementation 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
    implementation "com.android.billingclient:billing:5.1.0"

    implementation 'org.junit.jupiter:junit-jupiter:5.8.1'
}

非常感謝關於如何進一步改進這一點的評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM