Eu sei que posso carregar um arquivo de src / test / resources com:
getClass().getResource("somefile").getFile()
Mas como posso obter o caminho completo para o diretório src / test / resources , ou seja, não quero carregar um arquivo, apenas quero saber o caminho do diretório?
org.junit.rules.TemporaryFolder
o tempo todo ... mas ... para copiar dos testes / recursos, você precisa saber, er, seu caminho!Respostas:
Tente trabalhar com a
ClassLoader
classe:A
ClassLoader
é responsável pelo carregamento nas aulas. Toda classe tem uma referência aClassLoader
. Este código retorna aFile
do diretório de recursos. InvocágetAbsolutePath()
-lo retorna sua absolutaPath
.Javadoc para
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlfonte
Você não precisa mexer com os carregadores de classes. Na verdade, é um mau hábito entrar porque os recursos do carregador de classes não são objetos java.io.File quando estão em um arquivo jar.
O Maven define automaticamente o diretório de trabalho atual antes de executar os testes, para que você possa usar:
resourcesDirectory.getAbsolutePath()
retornará o valor correto se é isso que você realmente precisa.Eu recomendo criar um
src/test/data
diretório se você quiser que seus testes acessem dados através do sistema de arquivos. Isso deixa claro o que você está fazendo.fonte
Eu simplesmente usaria
Path
do Java 7Arrumado e limpo!
fonte
Paths.get(...)
sugere (para mim de qualquer maneira) que não.File.separator
constante para construir a string para ser usado como um caminhonew File("src/test/resources")
faz a coisa certa em todas as plataformas.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
ePaths.get("src/test/resources")
funciona bem no Windows 10 para mim. O que estou fazendo de errado? =)Se for um projeto de primavera, podemos usar o código abaixo para obter arquivos da pasta src / test / resource .
fonte
Eu tenho um projeto Maven3 usando JUnit 4.12 e Java8. Para obter o caminho de um arquivo chamado
myxml.xml
undersrc/test/resources
, faço isso de dentro do caso de teste:Testado no Ubuntu 14.04 com IntelliJ IDE. Referência aqui .
fonte
Todo o conteúdo
src/test/resources
é copiado para atarget/test-classes
pasta. Portanto, para obter o arquivo dos recursos de teste durante a compilação do maven, você deve carregá-lo datest-classes
pasta, assim:Demolir:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- fornecer URI paratarget/test-classes
.resolve(Paths.get("somefile"))
- resolvesomeFile
para atarget/test-classes
pasta.O analisador original é retirado deste
fonte
Existem diferenças e restrições nas opções oferecidas por @Steve C e @ ashosborne1. Eles devem ser especificados, acredito.
Quando podemos usar
File resourcesDirectory = new File("src/test/resources");
:?IntelliJ IDEA
, mas acho que todos os IDEs funcionam assim. E essa configuração que deve ser feita manualmente, não é boa. Trabalhando com vários testes existentes em diferentes projetos, mas importados para um grande projeto “IDE”, nos forçamos a lembrar disso e não permitimos relaxar e desfrutar do seu trabalho.A solução oferecida por @ ashosborne1 (pessoalmente, prefiro este) requer 2 requisitos adicionais que devem ser feitos antes da execução dos testes. Aqui está uma lista de etapas para usar esta solução:
Crie uma pasta de teste ("teva") e um arquivo ("leia-me") dentro de "src / test / resources /":
src / test / recursos / teva / readme
O arquivo deve ser criado na pasta de teste, caso contrário, não funcionará. Maven ignora pastas vazias.
Pelo menos uma vez construa o projeto via
mvn clean install
. Também executará testes. Pode ser suficiente executar apenas sua classe / método de teste via maven sem criar um projeto inteiro. Como resultado, seus recursos de teste serão copiados para classes de teste, eis um caminho:target/test-classes/teva/readme
Depois disso, você pode acessar a pasta usando o código, já oferecido por @ ashosborne1 (desculpe, não foi possível editar esse código dentro desta lista de itens corretamente):
Agora você pode executar seu teste via IDE quantas vezes quiser. Até você executar o mvn clean. Ele soltará a pasta de destino.
Criar arquivos dentro de uma pasta de teste e executar o maven pela primeira vez, antes de executar testes via IDE, são etapas necessárias. Sem essas etapas, se você apenas criar no IDE recursos de teste, gravar o teste e executá-lo apenas via IDE, receberá um erro. A execução de testes via mvn copia os recursos de teste para target / test-classes / teva / readme e eles se tornam acessíveis para um carregador de classe.
Você pode perguntar: por que preciso importar mais de um projeto de maven no IDE e por que tantas coisas complicadas? Para mim, uma das principais motivações: manter os arquivos relacionados à IDA longe do código. Primeiro criei um novo projeto no meu IDE. É um projeto falso, que é apenas um detentor de arquivos relacionados ao IDE. Em seguida, importo projetos maven já existentes. Forço esses projetos importados a manter os arquivos IDEA apenas no meu projeto falso original. Como resultado, não vejo arquivos relacionados ao IDE no código. O SVN não deve vê-los (não ofereça configurar o svn / git para ignorar esses arquivos, por favor). Também é apenas muito conveniente.
fonte
.gitignore
? Além disso, parece que o IDEA executa o Maven automaticamente ao executar testes (e define o diretório de trabalho correto por padrão$MODULE_DIR$
). Portanto, não há necessidade de executarmvn test
manualmente antes disso, tudo funciona bem tanto com o Maven quanto com o IDEA"src/test/resources/somefile.txt"
.A solução mais simples e limpa que eu uso, suponha que o nome da classe de teste seja
TestQuery1
e exista umresources
diretório em suatest
pasta da seguinte maneira:Para obter o URI do
TestQuery1
do:Para obter o URI de um dos arquivos
TestQuery1
, faça:fonte
Você não pode usar um arquivo de uma pasta de recursos para testes em um caso comum. O motivo é que os arquivos de recursos na pasta de recursos são armazenados dentro de um jar. Portanto, eles não têm um caminho real no sistema de arquivos.
A solução mais simples pode ser:
TemporaryFolder
fromJUnit
pode ser usado para criar arquivos temporários e excluí-lo após a conclusão do teste. Aulas deguava
biblioteca são usadas para copiar uma pasta de recursos do formulário de arquivo.Observe que, se usarmos uma subpasta na pasta de recursos, como
good
uma, não precisaremos adicionar/
o caminho do recurso.fonte
Use o seguinte para injetar o Hibernate with Spring em seus testes de unidade:
Se você não tiver o
hibernate.cfg.xml
presente na suasrc/test/resources
pasta, ele retornará automaticamente ao da suasrc/main/resources
pasta.fonte
Use .getAbsolutePath () no seu objeto File.
fonte
getFile()
retorna uma instância de arquivo. Ele diz quegetAbsolutePath()
é usado em uma instância do objeto File.Com o Spring, você pode lê-lo facilmente da pasta de recursos (principal / recursos ou teste / recursos):
Por exemplo, crie um arquivo:
test/resources/subfolder/sample.json
fonte
fonte