У меня есть многопроектная конфигурация, и я хочу использовать gradle.
Мои проекты такие:
Проект А
- ->
src/main/java
- ->
src/test/java
- ->
Проект Б
- ->
src/main/java
(зависитsrc/main/java
от проекта A ) - ->
src/test/java
(зависитsrc/test/java
от проекта A )
- ->
Файл моего проекта B build.gradle
выглядит так:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
Задача compileJava
работы большой , но compileTestJava
не компилировать тестовый файл из проекта A .
Ответы:
Устаревший - для Gradle 5.6 и выше используйте этот ответ .
В проекте B вам просто нужно добавить
testCompile
зависимость:Протестировано с Gradle 1.7.
источник
gradle testClasses
до того, как структура сборки станет действительной. Например, плагин Eclipse не позволит вам импортировать проект до этого. Это действительно позорtestCompile project(':A')
, не работает. @ DavidPärsson: «Gradle 1.3» противоречит «больше не», поскольку Феслер тестировал с Gradle 1.7.Простой способ - добавить явную зависимость задачи в ProjectB:
Сложный (но более понятный) способ - создать дополнительную конфигурацию артефактов для ProjectA:
и добавьте
testCompile
зависимость для ProjectBисточник
testArtifacts
конфигурацию, подобную этой:configurations { testArtifacts }
более подробную информацию смотрите в этом разделе справки Gradle: gradle.org/docs/current/dsl/…from sourceSets.test.output
и, возможно,classifier = 'tests'
замените его// pack whatever you need...
в ответеТеперь это поддерживается как первоклассная функция в Gradle. Модули с плагинами
java
илиjava-library
могут также включать в себяjava-test-fixtures
плагин, который предоставляет вспомогательные классы и ресурсы, которые будут использоватьсяtestFixtures
помощником. Преимущество этого подхода против артефактов и классификаторов:пример
:modul:one
Modul / один / build.gradle
Modul / один / SRC / testFixtures / Java / COM / пример / Helper.java
:modul:other
Modul / другие / build.gradle
Modul / другой / SRC / тест / Java / COM / пример / другой / SomeTest.java
дальнейшее чтение
Для получения дополнительной информации см. Документацию:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Он был добавлен в 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
источник
Я недавно столкнулся с этой проблемой, и человек это трудные вопросы, чтобы найти ответы.
Вы делаете ошибку, думая, что проект должен экспортировать свои тестовые элементы так же, как он экспортирует свои основные артефакты и зависимости.
То, с чем я лично добился гораздо большего успеха, - это создание нового проекта в Gradle. В вашем примере я бы назвал это
Проект A_Test -> src / main / java
Я бы поместил в src / main / java файлы, которые у вас есть в Project A / src / test / java. Сделайте любые зависимости testCompile вашего Project A зависимости компиляции Project A_Test.
Затем сделайте Project A_Test зависимостью testCompile проекта B.
Это не логично, когда вы подходите к этому с точки зрения автора обоих проектов, но я думаю, что это имеет смысл, когда вы думаете о таких проектах, как junit и scalatest (и другие. Даже если эти фреймворки связаны с тестированием, они не считаются частью «тестовых» целей в их собственных средах - они создают основные артефакты, которые другие проекты используют в своей тестовой конфигурации. Вы просто хотите следовать той же схеме.
Попытка сделать другие ответы, перечисленные здесь, не сработала лично для меня (используя Gradle 1.9), но я обнаружил, что шаблон, который я здесь описываю, в любом случае является более чистым решением.
источник
Я знаю, что это старый вопрос, но у меня была та же проблема, и я потратил некоторое время на выяснение того, что происходит. Я использую Gradle 1.9. Все изменения должны быть в ProjectB's
build.gradle
Чтобы использовать тестовые классы из ProjectA в тестах ProjectB:
Чтобы убедиться, что
sourceSets
свойство доступно для ProjectA:Чтобы убедиться, что тестовые классы из ProjectA действительно присутствуют при компиляции ProjectB:
источник
.classesDir
.Новое решение на базе testJar (поддерживается trnsitive зависимость), доступное как плагин gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
Из документации
источник
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Пожалуйста, прочтите обновление ниже.
Подобные проблемы, описанные JustACluelessNewbie, возникают в IntelliJ IDEA. Проблема в том, что зависимость на
testCompile project(':core').sourceSets.test.output
самом деле означает: «зависеть от классов, сгенерированных задачей сборки gradle». Поэтому, если вы откроете чистый проект, где классы еще не созданы, IDEA не распознает их и сообщит об ошибке.Чтобы решить эту проблему, вы должны добавить зависимость от тестовых исходных файлов рядом с зависимостью от скомпилированных классов.
Вы можете наблюдать зависимости, распознаваемые IDEA, в Настройках модуля -> Зависимости (область тестирования) .
Btw. Это не очень хорошее решение, поэтому стоит подумать о рефакторинге. Сам Gradle имеет специальный подпроект, содержащий только классы поддержки тестирования. См. Https://docs.gradle.org/current/userguide/test_kit.html.
Обновление 2016-06-05 Подробнее Я думаю о предлагаемом решении меньше, мне нравится. Есть несколько проблем с этим:
Так какое же решение лучше? На мой взгляд, это создание нового пользовательского набора исходных кодов и добавление в него общих классов. На самом деле авторы проекта Gradle сделали это, создав исходный набор testFixtures.
Для этого вам просто нужно:
Объявите правильную зависимость в зависимом проекте:
источник
Решение Феслера не сработало для меня, когда я попытался построить проект для Android (версия 2.2.0). Поэтому мне пришлось ссылаться на необходимые классы вручную:
источник
@VisibleForTesting
правила Lint. Вы не сможете вызывать такие методы из обычного модуля в не тестовой папке.Я так опоздал на вечеринку (теперь это Gradle v4.4), но для всех, кто найдет это:
Предполагая, что:
Перейдите к build.gradle проекта B (который нуждается в нескольких тестовых классах из A) и добавьте следующее:
или (при условии, что ваш проект называется «ProjectB»)
Вуаля!
источник
Если у вас есть фиктивные зависимости, которые вам нужно разделить между тестами, вы можете создать новый проект,
projectA-mock
а затем добавить его как тестовую зависимостьProjectA
иProjectB
:Это понятно решение зависимостей доли ложных, но если вам нужно запустить тесты из
ProjectA
вProjectB
использовании другого решения.источник
Если вы хотите использовать зависимости артефактов, чтобы:
тогда раздел зависимостей ProjectB в build.gradle должен выглядеть примерно так:
Для того, чтобы это работало, ProjectA необходимо создать банку -tests и включить ее в артефакты, которые он создает.
Файл build.gradle в ProjectA должен содержать следующую конфигурацию:
Когда артефакты Projecta публикуются на ваш Artifactory они будут включать в себя - тесты банку .
TestCompile в зависимости разделе ProjectB принесет в классах в - тестах баночки.
Если вы хотите включить исходный и тестовый классы ProjectA в ProjectB для целей разработки, то раздел зависимостей в build.gradle в ProjectB будет выглядеть следующим образом:
источник
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(в сценарии сборки kotlin), я определил, какие конфигурации все еще существуют и имеют зависимости, но на все эти вопросы Gradle пожаловался: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.
Некоторые из других ответов так или иначе вызывали ошибки - Gradle не обнаружил тестовые классы из других проектов или проект Eclipse имел недопустимые зависимости при импорте. Если у кого-то есть такая же проблема, я предлагаю перейти с:
Первая строка заставляет Eclipse связать другой проект как зависимость, поэтому все источники включены и обновлены. Второй позволяет Gradle фактически видеть источники, не вызывая при этом каких-либо недопустимых ошибок зависимости, как это
testCompile project(':core').sourceSets.test.output
делает.источник
Здесь, если вы используете Kotlin DSL , вы должны создать свою задачу в соответствии с документацией Gradle .
Как и в предыдущем ответе, вам нужно создать специальную конфигурацию внутри проекта, которая будет использовать класс тестов, чтобы вы не смешивали тестовые и основные классы.
Простые шаги
build.gradle.kts
:build.gradle.kts
:источник
в проекте B:
Кажется, работает в 1.7-RC-2
источник