【问题标题】:How to keep Java code and Junit tests together building with Gradle如何使用 Gradle 将 Java 代码和 Junit 测试保持在一起
【发布时间】:2013-03-08 16:36:03
【问题描述】:

我有一个项目,其中主要源代码和该源代码的测试用例保存在同一个包/目录中。每个测试类都是它正在测试的类的名称,并在末尾附加“Test”。因此,如果我有一个 Foo.java,那么它旁边就会有一个 FooTest.java。

我的问题是,如何使用 Gradle 构建这个项目?我仍然希望将类文件分开,即主类的文件夹和测试类的文件夹。

【问题讨论】:

  • 您为什么不简单地做正确(且更容易)的事情并将生产类与测试类分开?
  • gradle 背后的部分意识形态是构建工具不应该决定这样的决定,而应该允许灵活性。
  • 我知道gradle,我认为应该可以。但是你为什么要让你的生活变得比需要的更艰难呢?我想不出任何不将测试类与生产类分开的充分理由。
  • “Gradle 欢迎意外”-Hans Dockter,Gradle 和 Gradleware 的创始人。为了直接回答你的问题,我目前正在评估 Gradle,我想遇到一些“意想不到的”事情,所以我可以测试 Hans 的这个陈述是否属实。我喜欢灵活的构建工具的想法。是 Gradle 吗?
  • 你应该可以修改maintest SourceSets:设置它们的源目录,排除*Test.java作为主要源集,包括*Test.java作为测试源放。见gradle.org/docs/current/dsl/…

标签: gradle


【解决方案1】:

这应该可以解决问题:

sourceSets {
    main {
        java {
            srcDirs = ["some/path"]
            exclude "**/*Test.java"
        }
    }
    test {
        java {
            srcDirs = ["some/path"]
            include "**/*Test.java"
        }
    }
}

【讨论】:

  • 这似乎可以做到,但它似乎也破坏了 Eclipse 插件。现在,如果我运行 eclipse 任务,它会将“一些/路径”放入源中两次。我可以使用 eclipse.classpath.file 上的“whenMerged”函数来解决这个问题。哪个有点整洁,但也许有更清洁的方法?
  • 生成的 Eclipse 设置正确反映了 Gradle 设置。有什么问题吗?
  • 是的,它会导致读取的问题; “构建路径包含重复条目:项目''的'src'”我看到导致问题的类路径条目,我认为从逻辑上讲它不应该是一个问题。但是eclipse仍然无法处理它。我将把我的解决方法放在下面的答案中。
【解决方案2】:

作为参考,这里是我用来尝试解决 Eclipse 插件的类路径问题的代码。将此与上述彼得的答案结合使用似乎可行。

// The following ensures that Eclipse uses only one src directory
eclipse {
    classpath {
        file {
            //closure executed after .classpath content is loaded from existing file
            //and after gradle build information is merged
            whenMerged { classpath ->
                classpath.entries.removeAll { entry -> entry.kind == 'src'}
                def srcEntry = new org.gradle.plugins.ide.eclipse.model.SourceFolder('src', null)
                srcEntry.dir = file("$projectDir/src")
                classpath.entries.add( srcEntry )
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    这对我有用:

    eclipse {
       classpath {
          file {
            withXml { 
                process(it.asNode())
              }
          }
       }
    }
    def process(node) {
      if (node.attribute('path') == 'src/test/java' || node.attribute('path') == 'src/test/resources')
        node.attributes().put('output', "build/test-classes")
      else
       node.children().each {
          process(it)
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2011-11-15
      • 2014-01-09
      • 2021-03-15
      • 1970-01-01
      • 2022-06-13
      • 2017-05-29
      相关资源
      最近更新 更多