Compartilhando classes src / test entre módulos em um projeto maven de vários módulos

120

Eu tenho um projeto Maven com vários módulos. Para fins deste exemplo, considere dois módulos:

  • data
  • consumer

O módulo consumerpossui o módulo datacomo uma dependência.

O módulo datadeclara várias classes principais. Existem testes para src/testusá-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/testhierarquia.

Também tenho alguns testes no consumermódulo que precisam criar alguns desses objetos longos. Quero usar minha SampleDataHelperclasse (definida em data src/test) em testes que residem na minha consumer src/testárvore. Infelizmente, mesmo sendo datauma dependência consumer, consumernão consigo ver as classes que existem abaixo data src/test.

Para combater isso, pensei em criar outro módulo ( data-test) e passar SampleDataHelperpara ele abaixo src/main. Então eu incluiria data-testcomo dependência de escopo de testedata . Infelizmente, isso introduz uma dependência circular: datausa data-test, mas data-testtambém exige data.

A única solução que eu vim acima com é colocar SampleDataHelpersob data src/mainsob um testpacote e esperança de que nenhum código de aplicação real nunca chama.

Como posso compartilhar minha SampleDataHelperclasse entre módulos sem colocá-la em baixo src/main?

Greg Kopff
fonte
1
Confira esta resposta . Eu acho que deveria ajudá-lo.
Andrew Logvinov
7
Para futuros leitores: Guia Maven ao uso de testes em anexo
Greg Kopff
@AndrewLogvinov: sua resposta vinculada não exigiria uma compilação de "duas etapas"? Para criar e implantar primeiro um módulo ( data) antes que eu possa compilar meu segundo módulo ( consumer).
22613 Greg Kopff
Eu acho que você pode se deparar com alguns problemas se usar mvn package, mas deve funcionar bem em uma única etapa de compilação quando você usa mvn installou mvn deploy. Apenas uma nota rápida. Em um de nossos grandes projetos, temos um invólucro sobre o junit TestBasee ele está localizado no src/mainqual também não considero uma boa idéia.
Andrew Logvinov 06/02

Respostas:

152

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:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Seu projeto Consumer dependeria do artefato normal Data JAR, além do test-jarartefato adicional , com o escopo de teste, é claro:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

Eu usei essa abordagem em muitas ocasiões e funciona bem.

Duncan Jones
fonte
1
em relação a "Seu projeto Consumidor dependeria do artefato normal do JAR de Dados, mais o artefato adicional do frasco de teste", quando adiciono as dependências de dados ao consumidor (digamos, meus artefatos também denominam dados e consumidor) pom, sem especificação de versões específicas, o pom obteve erro. Por que isso acontece?
Johnny
@StasS provavelmente é melhor você abrir uma pergunta separada sobre isso.
Duncan Jones
1

Então o problema é que (alguns) testes no datamódulo dependem da SampleDataHelperclasse? Você pode mover a SampleDataHelperclasse para src/maino data-testmódulo, se, ao mesmo tempo, mover os testes (que dependem da classe específica) para src/testo data-testmódulo. Consequentemente, não haveria mais dependências circulares.

Matsev
fonte
1
Se eu entendi, você está sugerindo que qualquer teste que SampleDataHelperseja usado seja movido do datamódulo ou do consumermódulo (conforme apropriado) para data-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 os datatestes, mas acho que me veria movendo os dois por consistência). Mas obrigado pela sua resposta. :-)
Greg Kopff 6/13
1
Sim, você me entendeu corretamente. E, sem dúvida, é mais uma solução rápida do que pura. :-)
matsev 6/02/2013
Eu imaginaria que as dependências circulares permaneceriam. Supondo que os testes em questão exercitem as classes definidas no projeto Data, ainda seria necessário fazer uma referência ao projeto Data a partir do projeto Data-Test.
Duncan Jones
1
@DuncanJones Desculpe, houve um pequeno erro de digitação no meu post. O ponto que estou tentando ressaltar é que o data-testmódulo deve depender do datamódulo (e não o contrário). Para evitar a dependência circular, todos os testes que atualmente residem no datamódulo que usa o SampleDataHelperdevem ser movidos para o data-testmódulo.
6163 matsev
Entendi, isso faz mais sentido.
Duncan Jones