2013-03-08 49 views
6

我有一个项目,其中源的主要源代码和测试用例保存在同一个包/目录中。每个测试类都是它正在测试的类的名称,并在末尾附加了“Test”。所以如果我有一个Foo.java,它旁边会有一个FooTest.java。如何将Java代码和Junit测试结合在一起构建Gradle

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

+0

你为什么不干脆做正确的(更容易)的事,生产类与测试类分开? – 2013-03-08 16:39:43

+0

gradle背后的意识形态的一部分是构建工具不应该决定这样的决定,但应该允许灵活性。 – MrQBerrt 2013-03-08 17:16:08

+0

我知道gradle,我认为它应该是可能的。但为什么你让自己的生活比需要的更难?我想不出有什么好的理由不把测试课与生产课分开。 – 2013-03-08 17:22:07

回答

9

这应该做的伎俩:

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

似乎这样做,但它似乎也打破了Eclipse插件。现在,如果我运行eclipse任务,它会在源中放入“some/path”两次。我可以通过eclipse.classpath.file中的“whenMerged”函数解决这个问题。这是一个整洁,但也许有一个更干净的方式来做到这一点? – MrQBerrt 2013-03-08 19:46:56

+0

生成的Eclipse安装程序正确地反映了Gradle设置。它会导致任何问题吗? – 2013-03-11 10:04:24

+0

是的,它会导致读取的问题; “构建路径包含项目''的重复条目:'src'”我看到导致问题的类路径条目,我从逻辑上看它应该不成问题。但日食仍然无法处理它。我将把我的解决方法放在下面的答案中。 – MrQBerrt 2013-03-11 13:41:50

3

供参考,在这里是我曾经试图让周围的Eclipse插件的类路径问题的代码。结合上面Peter的回答结合使用,似乎有效。

// 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) 
      } 
     } 
    } 
} 
0

这个工作对我来说:

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) 
}}