2013-03-08 3 views
6

У меня есть проект, в котором основной источник и тестовые примеры для этого источника хранятся в одном каталоге/каталоге. Каждый тестовый класс - это имя класса, который он тестирует с добавлением «Тест» в конце. Поэтому, если у меня есть Foo.java, рядом с ним будет FooTest.java.Как сохранить код Java и тесты Junit вместе с Gradle

Мой вопрос: как мне построить этот проект с помощью Gradle? Я все равно хотел бы сохранить файлы классов отдельно, т. Е. Папку для основных классов и папку для тестовых классов.

+0

Почему вы не просто делать правильные (и проще) вещь и отделить производственные классы от тестовых классов? –

+0

Часть идеологии, стоящей за градиентом, заключается в том, что инструмент построения не должен диктовать такие решения, но должен обеспечивать гибкость. – MrQBerrt

+0

Я знаю, град, и я думаю, это должно быть возможно. Но почему вы делаете свою жизнь труднее, чем нужно? Я не могу придумать какой-либо веской причины не отделять классы тестов от производственных классов. –

ответ

9

Это должно сделать трюк:

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

Это похоже, делает это, но также, похоже, нарушает плагин Eclipse. Теперь, если я запустил задачу eclipse, он дважды помещает «some/path» в источники. Мне удалось обойти это с помощью функции «whenMerged» в файле eclipse.classpath.file. Какая-то аккуратная, но, может быть, был более чистый способ сделать это? – MrQBerrt

+0

Сгенерированная настройка Eclipse правильно отражает настройку Gradle. Это вызывает проблемы? –

+0

Да, это вызывает проблему, которая читается; «Путь сборки содержит повторяющуюся запись:« src »для проекта« <имя-проекта> »« Я вижу записи в классе, которые вызывают проблему, и я вижу, что логически это не должно быть проблемой. Но затмение все еще не справляется с этим. Я отвечу на этот вопрос ниже. – MrQBerrt

3

Для справки, вот код, который я использовал, чтобы попытаться обойти вопрос пути CLASSPATH плагина 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) 
      } 
     } 
    } 
} 
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) 
}} 
Смежные вопросы