Spring Junit contexto de aplicação de carga para testes

Eu tenho alguns arquivos XML no meu diretório WEB-INF:

  • lyricsBaseApp-servlet.xml
  • hibernate.xml
  • dataSource.xml
  • beans.xml

o servlet xml importa outros arquivos xml:

   

Eu gostaria que minha class junit4 JukeboxTest incluísse toda a configuração de mola. Usando o nome de arquivo padrão, criei um arquivo JukeboxTest-content.xml . E finalmente, eu não sei o que colocar aí …

Eu tentei:

    

ou

    

e algumas outras ideias, mas todas falharam. Alguém poderia me apontar como acessar esses arquivos e como spring interpreta esses caminhos de arquivos?

Opção 1 (deve ser preferida, pois é a melhor prática):
Refatore seus arquivos de configuração no WEB-INF e mova as partes comuns (que você deseja acessar também de testes de integração) para src/main/resources/ . Em seguida, escreva os arquivos de configuração específicos do teste em src/test/resources/ (se você precisar importar vários arquivos de configuração diferentes de src/main para montar seu contexto de teste, ignore-o e use @ContextConfiguration preferencialmente).

Opção 2 (hack):
Use referências como:

 @ContextConfiguration("file:src/main/webapp/WEB-INF/dataSource.xml") 

Opção 3 (hack):
Se você tem um projeto Maven, você pode configurar o maven-surefire-plugin (usado na fase de teste) para declarar src/main/webapp como um elemento de caminho de class adicional durante a execução do teste.

As duas últimas opções são consideradas hack, porque os arquivos sob src/main/webapp simplesmente não deveriam estar no caminho de class.

Agora a explicação detalhada:

A razão pela qual você não pode se referir a esses arquivos como classpath:/WEB-INF/*.xml é que eles não estão no caminho de class. É importante entender como seu webapp é empacotado e o que exatamente termina no caminho de class. Assumindo uma estrutura de projeto padrão do Maven:

  1. As classs Java de src/main/java vão para /WEB-INF/classs após a compilation.
  2. Recursos de src/main/resources vão para /WEB-INF/classs também.
  3. Dependências do projeto vão para /WEB-INF/lib .
  4. Tudo o que você tem em src/main/webapp vai para / (raiz do pacote). Isso significa que todos os arquivos de src/main/webapp/WEB-INF vão para /WEB-INF , é claro.

O mais importante é saber que o classpath conterá apenas /WEB-INF/classs e uma input para cada jar no /WEB-INF/lib . Consequentemente, os resources fora desses dois locais são completamente invisíveis para o carregador de class. Isso também é verdadeiro para os arquivos de configuração xml diretamente em /WEB-INF , e é por isso que o classpath:/WEB-INF/dataSource.xml referência classpath:/WEB-INF/dataSource.xml nunca funcionará.

Você pode se perguntar, como diabos são esses arquivos de configuração xml carregados pelo Spring se eles não estão acessíveis a partir do classpath? A resposta é simples: quando você inicia seu webapp (ao contrário de executar apenas testes de unidade / integração), ele está em execução em um Contêiner de Servlet que fornece access ao ServletContext (uma class real da API do Servlet), portanto, usa ServletContext.getResourceAsStream() para carregar esses arquivos. A chave para entender é a seguinte citação do javadoc desse método:

Esse método é diferente de java.lang.Class.getResourceAsStream, que usa um carregador de classs. Esse método permite que os contêineres de servlet disponibilizem um recurso para um servlet de qualquer local, sem usar um carregador de classs.

Desculpe, isso se tornou muito longo, mas essa é a história toda …

tente isso

 @ContextConfiguration(locations = {"classpath:**/dataSource.xml", "classpath:**/hibernate.xml", "classpath:**/WEB-INF/beans.xml"}) 
    Intereting Posts