Em um teste de unidade, como posso ler dados de um arquivo json em meu sistema de arquivos (desktop), sem codificar o caminho?
Gostaria de ler a entrada de teste (para meus métodos de análise) de um arquivo em vez de criar Strings estáticas.
O arquivo está no mesmo local que meu código de teste de unidade, mas também posso colocá-lo em outro lugar do projeto, se necessário. Estou usando o Android Studio.
test_documents.json
? diretório de ativos?Respostas:
Dependendo da
android-gradle-plugin
versão:1. versão 1.5 e superior:
Basta colocar o arquivo json
src/test/resources/test.json
e referenciá-lo comoNenhuma modificação gradle é necessária.
2. versão abaixo de 1.5 : (ou se por algum motivo a solução acima não funcionar)
Certifique-se de usar pelo menos o Android Gradle Plugin versão 1.1 . Siga o link para configurar o Android Studio corretamente.
Crie o
test
diretório. Coloque classes de teste de unidade nojava
diretório e coloque seu arquivo de recursos nores
diretório. O Android Studio deve marcá-los como segue:Crie uma
gradle
tarefa para copiar recursos no diretório de classes para torná-los visíveis paraclassloader
:Agora você pode usar este método para obter
File
referência para o recurso de arquivo:fonte
src/test/resources/test.json
e faça referência a ele comoclassLoader.getResource("test.json")
. Nenhuma modificação gradle é necessária. As pastas aninhadas dentroresources
também estão funcionando.classLoader
? onde colocar esta linha de código? o que você pode fazer com o resultado de retorno ?. Forneça um código mais completo. -1./src/test/resources/file.txt
em Kotlin:TestClassName::class.java.getResource("/file.txt")!!.readText()
Para testes de unidade locais (vs. testes de instrumentação), você pode colocar arquivos
src/test/resources
e lê-los usando classLoader. Por exemplo, o código a seguir abre omyFile.txt
arquivo no diretório de recursos.Funcionou com
fonte
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
No meu caso, a solução foi adicionar ao arquivo gradle
Depois disso tudo foi encontrado pelo AS 2.3.1
fonte
root/app/src/test/resources/test.json
2. leia os dados como este:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
Tive muitos problemas com recursos de teste no Android Studio, então configurei alguns testes para maior clareza. No meu projeto
mobile
(aplicativo Android), adicionei os seguintes arquivos:A classe de teste (todos os testes são aprovados):
No mesmo projeto raiz, tenho um projeto Java (não Android) chamado
data
. Se eu adicionar os mesmos arquivos ao projeto de dados:Então, todos os testes acima falharão se eu executá-los no Android Studio, mas eles passam na linha de comando com
./gradlew data:test
. Para contornar isso, eu uso este hack (em Groovy)Uso:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
fonte
getClassLoader()
versões funcionam conforme o esperado. Ou seja, eles encontram os arquivos, ambos executados no Android Studio E na linha de comando em minha máquina macOS e no servidor Linux CI (CircleCI). Então, vou continuar com isso e espero que o Gradle 3.3 não seja interrompido mais tarde ...build/resources/test
não serem incluídos no classpath interativo.Se você acessar Executar -> Editar configurações -> JUnit e selecionar a configuração de execução para seus testes de unidade, haverá uma configuração de 'Diretório de trabalho'. Isso deve apontar para onde quer que esteja seu arquivo json. Lembre-se de que isso pode quebrar outros testes.
fonte
new File()
ou semelhante, mas não funciona diretamente com o método de carregamento de caminho de classe descrito acima. Também é um pouco complicado porque cada nova configuração de execução precisa definir o diretório de trabalho e, por padrão, as linhas de comando do AS e do Gradle usam diferentes diretórios de trabalho ... uma dor de cabeçaAchei que deveria adicionar minhas descobertas aqui. Eu sei que isso é um pouco antigo, mas para as versões mais recentes do Gradle, onde NÃO existe o diretório src / test / resources, mas apenas um único diretório de recursos para todo o projeto, é necessário adicionar esta linha ao arquivo Gradle.
Ao fazer isso, você pode acessar seu recurso com:
Tenho procurado por isso e não consegui encontrar uma resposta, então decidi ajudar outras pessoas aqui.
fonte
Na verdade, isso é o que funcionou para mim com os testes de instrumentação (executando o Android Studio versão 3.5.3 , Android Gradle Plugin versão 3.5.3 , Gradle versão 6.0.1 ):
src/androidTest/assets
pastaInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
fonte