Eu tenho um projeto Maven com vários módulos. Para fins deste exemplo, considere dois módulos:
data
consumer
O módulo consumer
possui o módulo data
como uma dependência.
O módulo data
declara várias classes principais. Existem testes para src/test
usá-los. Esses testes exigem alguma criação de objetos longos, então eu tenho uma classe com alguns métodos utilitários para criar esses objetos. Esta classe de utilitário ( SampleDataHelper
) está na src/test
hierarquia.
Também tenho alguns testes no consumer
módulo que precisam criar alguns desses objetos longos. Quero usar minha SampleDataHelper
classe (definida em data src/test
) em testes que residem na minha consumer src/test
árvore. Infelizmente, mesmo sendo data
uma dependência consumer
, consumer
não consigo ver as classes que existem abaixo data src/test
.
Para combater isso, pensei em criar outro módulo ( data-test
) e passar SampleDataHelper
para ele abaixo src/main
. Então eu incluiria data-test
como dependência de escopo de testedata
. Infelizmente, isso introduz uma dependência circular: data
usa data-test
, mas data-test
também exige data
.
A única solução que eu vim acima com é colocar SampleDataHelper
sob data src/main
sob um test
pacote e esperança de que nenhum código de aplicação real nunca chama.
Como posso compartilhar minha SampleDataHelper
classe entre módulos sem colocá-la em baixo src/main
?
data
) antes que eu possa compilar meu segundo módulo (consumer
).mvn package
, mas deve funcionar bem em uma única etapa de compilação quando você usamvn install
oumvn deploy
. Apenas uma nota rápida. Em um de nossos grandes projetos, temos um invólucro sobre o junitTestBase
e ele está localizado nosrc/main
qual também não considero uma boa idéia.Respostas:
Seu projeto Consumer depende do seu projeto Data, portanto, estamos felizes que os Dados devem ser criados antes do Consumidor. Como resultado, usando as técnicas sugeridas nos comentários , eu asseguraria que seu projeto Data contenha todo o código de teste que você deseja compartilhar e configure o POM para produzir um JAR de teste:
Seu projeto Consumer dependeria do artefato normal Data JAR, além do
test-jar
artefato adicional , com o escopo de teste, é claro:Eu usei essa abordagem em muitas ocasiões e funciona bem.
fonte
Então o problema é que (alguns) testes no
data
módulo dependem daSampleDataHelper
classe? Você pode mover aSampleDataHelper
classe parasrc/main
odata-test
módulo, se, ao mesmo tempo, mover os testes (que dependem da classe específica) parasrc/test
odata-test
módulo. Consequentemente, não haveria mais dependências circulares.fonte
SampleDataHelper
seja usado seja movido dodata
módulo ou doconsumer
módulo (conforme apropriado) paradata-test
. Infelizmente, não considero esta uma solução muito "elegante", pois move meus testes para fora do módulo que eles testam e para outro. (Estritamente falando, você disse apenas para mover osdata
testes, mas acho que me veria movendo os dois por consistência). Mas obrigado pela sua resposta. :-)data-test
módulo deve depender dodata
módulo (e não o contrário). Para evitar a dependência circular, todos os testes que atualmente residem nodata
módulo que usa oSampleDataHelper
devem ser movidos para odata-test
módulo.