2013-03-08 9 views
6

Mam projekt, w którym główne źródło i przypadki testowe dla tego źródła są przechowywane w tym samym katalogu/katalogu. Każda klasa testowa jest nazwą klasy, którą testuje z dodanym "Testem" na końcu. Więc jeśli mam Foo.java, obok niego pojawi się FooTest.java.Jak zachować kod Java i testy Junit razem budując z Gradle

Moje pytanie brzmi: jak mogę zbudować ten projekt z Gradle? Nadal chciałbym zachować oddzielne pliki klas, tj. Folder dla głównych klas i folder dla klas testowych.

+0

Dlaczego nie można po prostu zrobić sobie prawo (i łatwiej) rzeczy i rozdzielenia klas produkcyjnych z klas test? –

+0

Częścią ideologii stojącej za gradle jest to, że narzędzie do budowania nie powinno dyktować takich decyzji, ale powinno umożliwiać elastyczność. – MrQBerrt

+0

Wiem, gradle, i myślę, że powinno być możliwe. Ale dlaczego sprawiasz, że twoje życie jest trudniejsze, niż powinno być? Nie mogę wymyślić żadnego dobrego powodu, aby oddzielić klasy testowe od klas produkcyjnych. –

Odpowiedz

9

To powinno załatwić sprawę:

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

To wydaje się, że to robi, ale wydaje się również, że przełamuje wtyczkę Eclipse. Teraz, jeśli uruchomię zadanie Zaćmienie, umieszcza ono "some/path" w źródłach dwa razy. Byłem w stanie obejść to z funkcją "whenMerged" w pliku eclipse.classpath.file. Co jest miłe, ale może był lepszy sposób na zrobienie tego? – MrQBerrt

+0

Wygenerowana konfiguracja Eclipse poprawnie odzwierciedla ustawienia Gradle. Czy powoduje jakieś problemy? –

+0

Tak, powoduje to problem, który czyta; "Ścieżka kompilacji zawiera zduplikowany wpis:" src "dla projektu" "" Widzę wpisy dotyczące ścieżki klasy, które powodują problem i widzę, że logicznie nie powinno to stanowić problemu. Ale Zaćmienie nadal nie może sobie z tym poradzić. Opiszę moje rozwiązanie w poniższej odpowiedzi. – MrQBerrt

3

Dla porównania, tutaj jest kod kiedyś spróbować obejść ścieżki klasy emisji Eclipse pluginu. Używanie tego w połączeniu z powyższą odpowiedzią Piotra wydaje się działać.

// 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

tej pracy dla mnie:

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) 
}} 
Powiązane problemy