Mam konfigurację z wieloma projektami i chcę używać gradle.
Moje projekty wyglądają tak:
Projekt A
- ->
src/main/java
- ->
src/test/java
- ->
Projekt B
- ->
src/main/java
(zależysrc/main/java
od projektu A ) - ->
src/test/java
(zależysrc/test/java
od projektu A )
- ->
Mój plik projektu B build.gradle
jest taki:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
Zadaniem compileJava
wielkie dzieło, ale compileTestJava
nie kompiluje plik testowy z Project A .
Odpowiedzi:
Przestarzałe - w przypadku Gradle 5.6 i nowszych użyj tej odpowiedzi .
W projekcie B wystarczy dodać
testCompile
zależność:Testowane za pomocą Gradle 1.7.
źródło
gradle testClasses
zanim struktura kompilacji będzie faktycznie prawidłowa. Np. Wtyczka Eclipse nie pozwoli ci zaimportować projektu wcześniej. Naprawdę szkoda,testCompile project(':A')
że nie działa. @ DavidPärsson: „Gradle 1.3” zaprzecza „już nie”, ponieważ Fesler testował z Gradle 1.7.Prostym sposobem jest dodanie jawnej zależności zadań w ProjectB:
Trudnym (ale bardziej przejrzystym) sposobem jest utworzenie dodatkowej konfiguracji artefaktów dla ProjectA:
i dodaj
testCompile
zależność dla ProjectBźródło
testArtifacts
konfigurację w ten sposób:configurations { testArtifacts }
aby uzyskać więcej informacji, zobacz tę sekcję pomocy Gradle: gradle.org/docs/current/dsl/…from sourceSets.test.output
i być możeclassifier = 'tests'
zamiast// pack whatever you need...
w odpowiedziJest to teraz obsługiwane jako funkcja pierwszej klasy w Gradle.Moduły z wtyczkami
java
lubjava-library
mogą również zawieraćjava-test-fixtures
wtyczkę, która udostępnia klasy pomocnicze i zasoby do wykorzystania ztestFixtures
pomocnikiem. Zalety tego podejścia w przypadku artefaktów i klasyfikatorów to:Przykład
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / example / Helper.java
:modul:other
modul / other / build.gradle
modul / other / src / test / java / com / example / other / SomeTest.java
Dalsza lektura
Więcej informacji można znaleźć w dokumentacji:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Został dodany w 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
źródło
Sam ostatnio natknąłem się na ten problem i człowieku jest to trudne zagadnienie do znalezienia odpowiedzi.
Błędem, który popełniasz, jest myślenie, że projekt powinien eksportować swoje elementy testowe w taki sam sposób, w jaki eksportuje swoje podstawowe artefakty i zależności.
Osobiście odniosłem dużo większy sukces, że zrobiłem nowy projekt w Gradle. W twoim przykładzie nazwałbym to
Projekt A_Test -> src / main / java
Umieściłbym w katalogu src / main / java pliki, które obecnie masz w projekcie A / src / test / java. Utwórz wszelkie zależności testCompile projektu Kompiluj zależności projektu A_Test.
Następnie ustaw projekt A_Test jako zależność testCompile projektu B.
Nie jest to logiczne, jeśli spojrzysz na to z perspektywy autora obu projektów, ale myślę, że ma to dużo sensu, gdy myślisz o projektach takich jak junit i scalatest (i innych. Mimo że te frameworki są związane z testowaniem, nie są uważane za część celów „testowych” w ich własnych strukturach - wytwarzają podstawowe artefakty, których inne projekty po prostu używają w swojej konfiguracji testowej. Po prostu chcesz podążać za tym samym wzorcem.
Próba wykonania innych wymienionych tutaj odpowiedzi nie zadziałała dla mnie osobiście (używając Gradle 1.9), ale stwierdziłem, że wzór, który tu opisuję, i tak jest czystszym rozwiązaniem.
źródło
Wiem, że to stare pytanie, ale miałem ten sam problem i spędziłem trochę czasu zastanawiając się, co się dzieje. Używam Gradle 1.9. Wszystkie zmiany powinny być w ProjectB
build.gradle
Aby użyć klas testowych z ProjectA w testach ProjectB:
Aby upewnić się, że ta
sourceSets
właściwość jest dostępna dla ProjectA:Aby upewnić się, że klasy testowe z ProjectA faktycznie istnieją, podczas kompilowania ProjectB:
źródło
.classesDir
.Nowe rozwiązanie oparte na testJar (obsługiwane trnsitive dependancies) dostępne jako wtyczka gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
Z dokumentacji
źródło
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Przeczytaj aktualizację poniżej.
Podobne problemy opisane przez JustACluelessNewbie występują w IntelliJ IDEA. Problem w tej zależności
testCompile project(':core').sourceSets.test.output
rzeczywistości oznacza: „zależą od klas wygenerowanych przez zadanie budowania gradle”. Więc jeśli otworzysz czysty projekt, w którym klasy nie są jeszcze wygenerowane, IDEA nie rozpozna ich i zgłosi błąd.Aby rozwiązać ten problem, musisz dodać zależność od testowych plików źródłowych obok zależności od skompilowanych klas.
Możesz obserwować zależności rozpoznawane przez IDEA w Ustawienia modułu -> Zależności (zakres testowy) .
Przy okazji. nie jest to fajne rozwiązanie, więc warto rozważyć refaktoryzację. Sam Gradle ma specjalny podprojekt zawierający tylko klasy obsługi testów. Zobacz https://docs.gradle.org/current/userguide/test_kit.html
Aktualizacja 2016-06-05 Więcej Myślę o proponowanym rozwiązaniu mniej mi się podoba. Jest z tym kilka problemów:
Więc jakie jest lepsze rozwiązanie? Moim zdaniem jest to tworzenie nowego niestandardowego zestawu źródeł i umieszczanie w nim wspólnych klas. Właściwie autorzy projektu Gradle zrobili to, tworząc zestaw źródeł testFixtures.
Aby to zrobić, wystarczy:
Zadeklaruj odpowiednią zależność w projekcie zależnym:
źródło
Rozwiązanie Feslera nie działało dla mnie, kiedy próbowałem go zbudować dla projektu Android (gradle 2.2.0). Musiałem więc ręcznie odwołać się do wymaganych klas:
źródło
@VisibleForTesting
zasady kłaczków. Nie będziesz mógł wywołać takich metod ze zwykłego modułu w folderze not test.Spóźniłem się na imprezę (teraz jest Gradle v4.4), ale dla każdego, kto to znajdzie:
Zarozumiały:
Przejdź do build.gradle projektu B (tego, który wymaga kilku klas testowych z A) i dodaj następujące elementy:
lub (zakładając, że Twój projekt nosi nazwę „ProjektB”)
Voila!
źródło
Jeśli masz pozorowane zależności, które musisz udostępniać między testami, możesz utworzyć nowy projekt,
projectA-mock
a następnie dodać go jako zależność testową doProjectA
iProjectB
:Jest oczywiste rozwiązanie zależności mock akcji, ale jeśli trzeba uruchomić testy z
ProjectA
wProjectB
użyciu innego rozwiązania.źródło
Jeśli chcesz użyć zależności artefaktów, aby mieć:
wtedy sekcja zależności ProjectB w build.gradle powinna wyglądać mniej więcej tak:
Aby to zadziałało, ProjectA musi zbudować -testy słoik i dołączyć go przez siebie artefaktów.
Plik build.gradle ProjectA powinien zawierać następującą konfigurację:
Kiedy artefakty ProjectA zostaną opublikowane w twojej wytwórni , będą zawierać słoik -tests .
Sekcja testCompile w zależnościach ProjectB wprowadzi klasy w -tests jar.
Jeśli chcesz uwzględnić klasy źródłowe i testowe w ProjectB w ProjectB do celów programistycznych, sekcja zależności w pliku build.gradle ProjectB wyglądałaby następująco:
źródło
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(w skrypcie kompilacji kotlin), ustaliłem, które konfiguracje nadal istnieją i mają zależności, ale dla wszystkich tych Gradle narzekał:Selected configuration 'testCompileClasspath' on 'project :sdk' but it can't be used as a project dependency because it isn't intended for consumption by other components.
Niektóre inne odpowiedzi powodowały błędy w ten czy inny sposób - Gradle nie wykrył klas testowych z innych projektów lub projekt Eclipse miał nieprawidłowe zależności po zaimportowaniu. Jeśli ktoś ma ten sam problem to proponuję wybrać:
Pierwsza linia wymusza na Eclipse połączenie innego projektu jako zależności, więc wszystkie źródła są uwzględnione i aktualne. Drugi pozwala Gradle faktycznie zobaczyć źródła, nie powodując żadnych nieprawidłowych błędów zależności, jak
testCompile project(':core').sourceSets.test.output
robi.źródło
Tutaj, jeśli używasz Kotlin DSL , powinieneś stworzyć swoje zadanie zgodnie z Gradle dokumentacją .
Podobnie jak w przypadku niektórych poprzednich odpowiedzi, musisz utworzyć specjalną konfigurację wewnątrz projektu, która będzie współdzielić klasę testów, aby nie mieszać klas testowych i głównych.
Proste kroki
build.gradle.kts
:build.gradle.kts
:źródło
w projekcie B:
Wydaje się działać w 1.7-rc-2
źródło