【问题标题】:Mockito and JUnit not found未找到 Mockito 和 JUnit
【发布时间】:2018-05-19 22:28:39
【问题描述】:

我有一个很老的项目,一开始是一个 eclipse 项目,现在是 gradle/android studio

目前我只有一个存储在路径中的测试

src/test/java/

我有下面的 gradle 文件

buildscript {
    ext.kotlin_version = '1.2.41'
    ext.latest_google_version = '27.1.1'
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
        maven { url 'https://dl.bintray.com/jetbrains/anko' }
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'io.fabric.tools:gradle:1.24.1'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'io.fabric'



kotlin {
    experimental {
        coroutines 'enable'
    }
}

repositories {
    maven { url "https://jitpack.io" }
    maven { url 'https://maven.fabric.io/public' }
    maven { url 'https://dl.bintray.com/jetbrains/anko' }
    mavenCentral()
    google()
    jcenter()
}

dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
        transitive = true
    }
    implementation('com.crashlytics.sdk.android:answers:1.4.1@aar') {
        transitive = true
    }
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.9'

    implementation 'com.jakewharton.rxbinding:rxbinding:0.4.0'
    implementation 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
    implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.anko:anko:0.10.3"
    implementation "com.android.support:support-v13:$latest_google_version"
    implementation "com.android.support:appcompat-v7:$latest_google_version"
    implementation "com.android.support:support-v4:$latest_google_version"
    implementation "com.android.support:support-core-utils:$latest_google_version"
    implementation "com.android.support:design:$latest_google_version"
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'

    // UnitTest frameworks
    testImplementation 'junit:junit:4.12'
    testImplementation "org.mockito:mockito-core:2.18.0"
    testImplementation "org.robolectric:robolectric:3.8"

    // androidTest frameworks
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'

}

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
        multiDexEnabled true
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/rxjava.properties'
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
//            resources.srcDirs = ['src']
//            aidl.srcDirs = ['src']
//            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
//            assets.srcDirs = ['assets']

        }

        // Move the tests to tests/java, tests/res, etc...
        androidTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

如果我使用上面的 gradle 文件运行我的单元测试,我会得到 ​​p> 的错误

Unresolved reference: junit 
Unresolved reference: junit 
Unresolved reference: mockito   
Unresolved reference: mockito   
Unresolved reference: mockito   
Unresolved reference: mockito   
Unresolved reference: Mock  
Unresolved reference: Before    
Unresolved reference: MockitoAnnotations    
Unresolved reference: Test  
Unresolved reference: verify    
Unresolved reference: verifyNoMoreInteractions  
Unresolved reference: Test  
Unresolved reference: Test

这在测试中引用 junit 的任何地方都有效。

如果我改变了

// UnitTest frameworks
testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-core:2.18.0"
testImplementation "org.robolectric:robolectric:3.8"

// UnitTest frameworks
implementation 'junit:junit:4.12'
implementation "org.mockito:mockito-core:2.18.0"
implementation "org.robolectric:robolectric:3.8"

测试编译但测试运行者会抱怨测试套件是空的。

我做错了什么?

【问题讨论】:

  • 您的测试是否在正确的源集中?这会导致您描述的问题 - 它们应该在 app/src/test/java/com/example/myapp 中,您可能需要在 build.gradle 中明确定义它们
  • 测试在{project name}/src/test/java/com/example/

标签: android junit kotlin mockito


【解决方案1】:

你的错误的原因是配置

main {
    java.srcDirs = ['src']
}

在这里,您定义整个 src 目录以包含 Java 主要源代码。默认目录是 src/main/java

由于您的测试存储在 src/test/java 中,因此它们也包含在主源中,因此您需要将配置从 testImplementation 更改为 implementation 以进行编译。

您应该考虑重组项目以满足默认设置,而不是手动配置源集。

【讨论】:

  • 我已将项目重组为默认项目,删除了 sourceSets,一切正常,谢谢
【解决方案2】:

这种错误可能是由于您的源集配置不正确造成的。在您的 build.gradle 中,您有以下内容:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
    //snip
    }

    // Move the tests to tests/java, tests/res, etc...
    androidTest.setRoot('tests')     
}

换句话说,您的 Android 测试(仪器测试)位于 src/tests/java/com/example。请注意,您还将 main 源集配置为所有 src/*,所以这也是不正确的 - 它应该只是 src/main

确保您已正确理解本地单元测试(通常位于 test 目录中)和检测单元测试(通常位于 androidTest 目录中)之间的区别,您还可以尝试添加以下闭包给你的build.gradle:

main {
    manifest.srcFile 'AndroidManifest.xml'
    java.srcDirs = ['src/main'] 
}

test {
    java.srcDirs = ['src/test']
}

那么您可能需要执行 Gradle 同步,如果这不起作用,您可以尝试 File -&gt; Invalidate caches/restart

祝你好运!

【讨论】:

  • // 将测试移动到 tests/java、tests/res 等... androidTest.setRoot('src/test/java') 对我来说是一个游戏规则改变者,非常感谢我试图使用“,”作为分隔符将测试路径添加到 main。
猜你喜欢
  • 2011-07-25
  • 2020-07-29
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多