【问题标题】:gradle compileJava error: package org.junit does not existgradle compileJava错误:包org.junit不存在
【发布时间】:2017-07-29 09:16:30
【问题描述】:

我正在尝试使用 gradle 实现一个简单的 junit 测试,并在运行 gradle test 时遇到以下问题:

:compileJava
/Users/wogsland/Projects/gradling/src/test/CalculatorTest.java:1: error: package org.junit does not exist
import static org.junit.Assert.assertEquals;
                       ^
/Users/wogsland/Projects/gradling/src/test/CalculatorTest.java:1: error: static import only from classes and interfaces
import static org.junit.Assert.assertEquals;
^
/Users/wogsland/Projects/gradling/src/test/CalculatorTest.java:2: error: package org.junit does not exist
import org.junit.Test;
                ^
/Users/wogsland/Projects/gradling/src/test/CalculatorTest.java:5: error: cannot find symbol
  @Test
   ^
  symbol:   class Test
  location: class CalculatorTest
/Users/wogsland/Projects/gradling/src/test/CalculatorTest.java:9: error: cannot find symbol
    assertEquals(6, sum);
    ^
  symbol:   method assertEquals(int,int)
  location: class CalculatorTest
5 errors
:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
Compilation failed; see the compiler error output for details.

所以我有这个build.gradle 文件:

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.12'
}

sourceSets {
  main {
    java {
      srcDir 'src'
    }
  }
}

还有CalculatorTest.java

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}

但是当我将它包含在依赖项中时,我无法弄清楚为什么它没有找到 junit。

【问题讨论】:

    标签: gradle junit build.gradle


    【解决方案1】:

    显然我需要添加一个compile 依赖项,然后还声明repositories。我成功运行测试的新build.gradle

    apply plugin: 'java'
    
    repositories { jcenter() }
    dependencies {
        testCompile 'junit:junit:4.12'
        compile 'junit:junit:4.12'
    }
    
    sourceSets {
        main {
            java {
                srcDir 'src'
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    我在最新的 android 版本中遇到了同样的问题,我已经使用下面的代码解决了这个问题。我希望你能得到帮助。

    dependencies {
        testImplementation 'junit:junit:4.12'
        implementation 'junit:junit:4.12'
    }
    

    【讨论】:

      【解决方案3】:

      我知道这是旧的,但我最近遇到了这个问题。您应该能够更改 srcdirs 以使用 gradle 进行测试,并且还可以进行单元测试。如果你想要一个 src/* 结构,那么只需将所有测试放在 test/* 中。

      您可能遇到的问题是,如果您将测试包含在 main/java 代码文件夹中,它将尝试在该阶段编译它们。将它们移出 src 文件夹并相应地更新 srcdir 结构,它应该可以按预期工作。

      apply plugin: 'java'
      
      repositories { jcenter() }
      dependencies {
          testCompile 'junit:junit:4.12'
      }
      
      sourceSets {
          main {
              java {
                  srcDir 'src'
              }
          }
          test {
              java {
                  srcDir 'test'
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        尝试添加

         repositories {
            maven { url 'http://repo1.maven.org/maven2' }
        

        直接在你的 buildscript 下{在 build.gradle 中

        【讨论】:

        • 那么,缺少buildscript { 可能是问题所在?
        • 以上build.gradle 就是我所拥有的。
        【解决方案5】:

        在您的 build.gradle 文件中添加这些依赖项:

        testImplementation 'junit:junit:4.12'
        implementation 'junit:junit:4.12'
        
        androidTestImplementation 'com.android.support:support-annotations:28.0.0'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test:rules:1.0.2'
        

        这解决了我的问题。希望这对你也有用。

        【讨论】:

          【解决方案6】:

          我真的觉得我必须将@WillC 的评论提升为顶级答案,因为这是关键点。 (我已将此标记为社区 wiki,因为从中获得任何代表对我来说是不公平的。)

          参见https://issuetracker.google.com/issues/37098629 :如果您更改了sourceSets,则 gradle 无法进行单元测试,您必须将 junit 编译到生产 APK 中。

          如果您在build.gradle 中完全指定sourceSets,您会发现Gradle 无法使用testImplementation(或testCompile)条目。它只是完全忽略了依赖关系,并且找不到那些类。

          正如@WillC 所指出的,唯一的解决方法是将测试依赖项编译到生产APK 中,方法是将testImplementation(和testCompile)更改为implementation(和compile)。这是一种反模式 (!!),但不幸的是,这是解决此问题的唯一方法。

          对我来说,我发现即使我没有指定 sourceSets,当我添加源代码树时,我的 IDE(Android Studio)“有用”地为我添加了该部分,这引发了问题。因为我不需要为 sourceSets 定制任何东西,所以我刚刚删除了它,这解决了问题。

          上面引用的评论中链接的优先级 1 错误涵盖了该问题,但该问题于 2016 年打开,但仍未解决:'(

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-06
            • 2015-02-06
            • 2018-05-06
            • 1970-01-01
            • 2017-11-01
            • 2020-10-23
            • 2015-06-27
            • 2019-02-28
            相关资源
            最近更新 更多