W teście jednostkowym, jak mogę odczytać dane z pliku JSON w moim (stacjonarnym) systemie plików bez zakodowania ścieżki na stałe?
Chciałbym czytać testowe dane wejściowe (dla moich metod analizy) z pliku zamiast tworzyć statyczne ciągi znaków.
Plik znajduje się w tej samej lokalizacji, co mój kod testów jednostkowych, ale w razie potrzeby mogę go również umieścić w innym miejscu projektu. Używam Android Studio.
android
unit-testing
android-studio
Szczery
źródło
źródło
test_documents.json
? katalog zasobów?Odpowiedzi:
W zależności od
android-gradle-plugin
wersji:1. wersja 1.5 i nowsze:
Po prostu umieść plik json
src/test/resources/test.json
i określ go jakoNie jest wymagana modyfikacja gradientu.
2. wersja poniżej 1.5 : (lub jeśli z jakiegoś powodu powyższe rozwiązanie nie działa)
Upewnij się, że używasz co najmniej wtyczki Android Gradle w wersji 1.1 . Kliknij łącze, aby poprawnie skonfigurować Android Studio.
Utwórz
test
katalog. Umieść klasy testów jednostkowych wjava
katalogu i umieść plik zasobów wres
katalogu. Android Studio powinno je oznaczyć następująco:Utwórz
gradle
zadanie kopiowania zasobów do katalogu zajęć, aby były widoczne dlaclassloader
:Teraz możesz użyć tej metody, aby uzyskać
File
odniesienie do zasobu plikowego:źródło
src/test/resources/test.json
i odwołaj się do niego jakoclassLoader.getResource("test.json")
. Nie jest wymagana modyfikacja gradacji.resources
Działają również zagnieżdżone foldery wewnątrz .classLoader
? gdzie umieścić ten wiersz kodu? co możesz zrobić z wynikiem zwrotu ?. Podaj pełniejszy kod. -1./src/test/resources/file.txt
w Kotlinie:TestClassName::class.java.getResource("/file.txt")!!.readText()
W przypadku lokalnych testów jednostkowych (w porównaniu z testami instrumentacji) można umieścić pliki pod
src/test/resources
i odczytać je za pomocą classLoader. Na przykład poniższy kod otwieramyFile.txt
plik w katalogu zasobów.To działało
źródło
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
W moim przypadku rozwiązaniem było dodanie do pliku gradle
Po tym wszystko zostało znalezione przez AS 2.3.1
źródło
root/app/src/test/resources/test.json
2. przeczytaj dane w ten sposób:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
Miałem wiele problemów z zasobami testowymi w Android Studio, więc skonfigurowałem kilka testów dla przejrzystości. W moim
mobile
projekcie (Android Application) dodałem następujące pliki:Klasa testu (wszystkie testy zdały):
W tym samym projekcie głównym mam projekt Java (nie Android) o nazwie
data
. Jeśli dodam te same pliki do projektu danych:Wtedy wszystkie powyższe testy zakończą się niepowodzeniem, jeśli wykonam je z Android Studio, ale przekażą je w wierszu poleceń z
./gradlew data:test
. Aby to obejść, używam tego hacka (w Groovy)Stosowanie:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
źródło
getClassLoader()
wersje działają zgodnie z oczekiwaniami. To znaczy, że znajdują pliki, oba uruchamiane z Android Studio ORAZ z wiersza poleceń na moim komputerze z systemem macOS i na serwerze Linux CI (CircleCI). Więc idę z tym i mam nadzieję, że Gradle 3.3 niebuild/resources/test
nie są uwzględnione w interaktywnej ścieżce klas.Jeśli przejdziesz do Uruchom -> Edytuj konfiguracje -> JUnit, a następnie wybierzesz konfigurację uruchamiania dla testów jednostkowych, pojawi się ustawienie „Katalog roboczy”. To powinno wskazywać na to, gdzie jest twój plik json. Pamiętaj, że może to zepsuć inne testy.
źródło
new File()
lub podobnego, ale nie działa bezpośrednio z metodą ładowania ścieżki klas opisaną powyżej. Jest to również trochę skomplikowane, ponieważ każda nowa konfiguracja uruchamiania musi ustawić katalog roboczy, a domyślnie linie poleceń AS i Gradle lubią używać różnych roboczych katalogów ... taki bólPomyślałem, że powinienem tutaj dodać swoje ustalenia. Wiem, że jest to trochę stare, ale w nowszych wersjach Gradle, w których NIE ma katalogu src / test / resources, ale tylko jeden katalog zasobów dla całego projektu, musisz dodać tę linię do pliku Gradle.
W ten sposób możesz uzyskać dostęp do swojego zasobu za pomocą:
Szukałem tego i nie mogłem znaleźć odpowiedzi, więc postanowiłem pomóc innym tutaj.
źródło
Właściwie to zadziałało dla mnie z testami instrumentacji (działa Android Studio w wersji 3.5.3 , wtyczka Android Gradle w wersji 3.5.3 , Gradle w wersji 6.0.1 ):
src/androidTest/assets
folderzeInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
źródło