Eu tenho uma configuração de vários projetos e quero usar o gradle.
Meus projetos são assim:
Projeto A
- ->
src/main/java
- ->
src/test/java
- ->
Projeto B
- ->
src/main/java
(dependesrc/main/java
do projeto A ) - ->
src/test/java
(dependesrc/test/java
do projeto A )
- ->
Meu arquivo do Projeto B build.gradle
é assim:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
A tarefa compileJava
grande trabalho, mas a compileTestJava
não compilar o arquivo de teste do Projeto A .
Respostas:
Descontinuado - Para o Gradle 5.6 e superior, use esta resposta .
No Projeto B , você só precisa adicionar uma
testCompile
dependência:Testado com Gradle 1.7.
fonte
gradle testClasses
antes que a estrutura de compilação seja realmente válida. Por exemplo, o plug-in do Eclipse não permitirá que você importe o projeto antes disso. É realmente uma penatestCompile project(':A')
que não funciona. @ DavidPärsson: "Gradle 1.3" contradiz "não mais" desde que Fesler testou com Gradle 1.7.A maneira simples é adicionar dependência de tarefa explícita no ProjectB:
A maneira mais difícil (mas mais clara) é criar uma configuração de artefato adicional para o ProjectA:
e adicione a
testCompile
dependência para o ProjectBfonte
testArtifacts
configuração como esta:configurations { testArtifacts }
para obter mais detalhes, consulte esta seção da ajuda do Gradle: gradle.org/docs/current/dsl/…from sourceSets.test.output
e possivelmenteclassifier = 'tests'
no lugar da// pack whatever you need...
respostaAgora isso é suportado como um recurso de primeira classe no Gradle. Módulos com
java
oujava-library
plug - ins também podem incluir umjava-test-fixtures
plug - in que expõe classes e recursos auxiliares a serem consumidos com otestFixtures
auxiliar. Os benefícios dessa abordagem contra artefatos e classificadores são:Exemplo
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / example / Helper.java
:modul:other
modul / outro / build.gradle
módulo / outro / src / test / java / com / exemplo / outro / SomeTest.java
Leitura adicional
Para obter mais informações, consulte a documentação:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Foi adicionado na versão 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
fonte
Eu me deparei com esse problema recentemente, e o homem é uma questão difícil de encontrar respostas.
O erro que você está cometendo é pensar que um projeto deve exportar seus elementos de teste da mesma maneira que exporta seus artefatos e dependências principais.
O que eu tive muito mais sucesso pessoalmente foi fazer um novo projeto em Gradle. No seu exemplo, eu o nomearia
Projeto A_Test -> src / main / java
Eu colocaria no src / main / java os arquivos que você possui atualmente no Projeto A / src / test / java. Faça qualquer dependência testCompile do seu Projeto A, compile dependências do Projeto A_Test.
Em seguida, torne o Projeto A_Test uma dependência testCompile do Projeto B.
Não é lógico quando você aborda a questão da perspectiva do autor dos dois projetos, mas acho que faz muito sentido pensar em projetos como junit e scalatest (e outros.) Embora essas estruturas sejam relacionadas a testes, elas não são considerados parte dos destinos de "teste" em suas próprias estruturas - eles produzem artefatos principais que outros projetos acabam usando na sua configuração de teste.Você só deseja seguir o mesmo padrão.
Tentar fazer as outras respostas listadas aqui não funcionou para mim pessoalmente (usando o Gradle 1.9), mas descobri que o padrão que descrevo aqui é uma solução mais limpa.
fonte
Sei que é uma pergunta antiga, mas só tive o mesmo problema e passei algum tempo tentando descobrir o que estava acontecendo. Estou usando o Gradle 1.9. Todas as alterações devem estar no ProjectB
build.gradle
Para usar as classes de teste do ProjectA nos testes do ProjectB:
Para garantir que a
sourceSets
propriedade esteja disponível para o ProjectA:Para garantir que as classes de teste do ProjectA estejam realmente presentes, quando você compila o ProjectB:
fonte
.classesDir
.Nova solução baseada em testJar (dependências trnsitive suportadas) disponível como plugin gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
Da documentação
fonte
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Por favor, leia a atualização abaixo.
Problemas semelhantes descritos por JustACluelessNewbie ocorrem no IntelliJ IDEA. O problema é que dependência
testCompile project(':core').sourceSets.test.output
realmente significa: "depende de classes geradas pela tarefa de construção de gradle". Portanto, se você abrir um projeto limpo, onde as classes ainda não são geradas, o IDEA não as reconhecerá e reportará erros.Para corrigir esse problema, você deve adicionar uma dependência nos arquivos de origem de teste ao lado da dependência nas classes compiladas.
Você pode observar dependências reconhecidas pela IDEA em Configurações do módulo -> Dependências (escopo do teste) .
Btw. Como não é uma solução agradável, vale a pena considerar a refatoração. O próprio Gradle possui um subprojeto especial contendo apenas classes de suporte de teste. Consulte https://docs.gradle.org/current/userguide/test_kit.html
Atualizar 2016-06-05 Mais Estou pensando em uma solução proposta menos que eu goste. Existem alguns problemas com isso:
Então, qual é a melhor solução? Na minha opinião, está criando um novo conjunto de fontes personalizadas e colocando classes compartilhadas nele. Na verdade, os autores do projeto Gradle fizeram isso criando o conjunto de fontes testFixtures.
Para fazer isso, basta:
Declare a dependência apropriada no projeto dependente:
fonte
A solução do Fesler não funcionou para mim, quando tentei criar um projeto android (gradle 2.2.0). Então eu tive que fazer referência manualmente às classes necessárias:
fonte
@VisibleForTesting
regras do fiapo. Você não poderá chamar esses métodos a partir do módulo regular na pasta não teste.Estou muito atrasado para a festa (agora é o Gradle v4.4), mas para qualquer pessoa que encontrar isso:
Assumindo:
Vá para o build.gradle do projeto B (aquele que precisa de algumas classes de teste de A) e adicione o seguinte:
ou (supondo que seu projeto seja nomeado "ProjetoB")
Voila!
fonte
Se você tiver dependências simulados que você precisa para compartilhar entre os testes, você pode criar novo projeto
projectA-mock
e, em seguida, adicioná-lo como dependência de teste paraProjectA
eProjectB
:Este é solução clara para dependências share simulados, mas se você precisa para executar testes de
ProjectA
emProjectB
uso outra solução.fonte
Se você deseja usar dependências de artefato para ter:
a seção de dependências do ProjectB em build.gradle deve ter a seguinte aparência:
Para que isso funcione, o ProjectA precisa criar um teste frasco de e incluí-lo nos artefatos que produz.
O build.gradle do ProjectA deve conter uma configuração como esta:
Quando os artefatos do ProjectA forem publicados no seu artefato, eles incluirão um frasco de testes .
O testCompile na seção de dependências do ProjectB trará as classes no jar -tests .
Se você deseja incluir as classes de origem e teste do ProjectA do FLAT no ProjectB para fins de desenvolvimento, a seção de dependências no build.gradle do ProjectB ficaria assim:
fonte
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(em um buildscript da kotlin), determinei quais configurações ainda existem e têm dependências, mas para todas essas reclamações da 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.
Algumas das outras respostas causaram erros de uma maneira ou de outra - Gradle não detectou classes de teste de outros projetos ou o projeto Eclipse tinha dependências inválidas quando importadas. Se alguém tiver o mesmo problema, sugiro ir com:
A primeira linha força o Eclipse a vincular o outro projeto como dependência, para que todas as fontes sejam incluídas e atualizadas. O segundo permite que Gradle veja realmente as fontes, sem causar erros de dependência inválidos, como
testCompile project(':core').sourceSets.test.output
ocorre.fonte
Aqui, se você estiver usando o Kotlin DSL , crie sua tarefa assim, de acordo com a documentação da Gradle .
Como em algumas respostas anteriores, você precisa criar uma configuração especial dentro do projeto que compartilhará sua classe de testes, para não misturar as classes principal e de teste.
Passos simples
build.gradle.kts
:build.gradle.kts
:fonte
no projeto B:
Parece funcionar em 1.7-rc-2
fonte