Wiem, że mogę załadować plik z src / test / resources za pomocą:
getClass().getResource("somefile").getFile()
Ale w jaki sposób można uzyskać pełną ścieżkę do src / test / zasobów katalogu , to znaczy nie chcę, aby załadować plik, po prostu chcę znać ścieżkę katalogu?
org.junit.rules.TemporaryFolder
cały czas ... ale ... aby skopiować z testu / zasobów, musisz wiedzieć, er, jego ścieżka!Odpowiedzi:
Spróbuj pracować z
ClassLoader
klasą:A
ClassLoader
odpowiada za ładowanie w klasach. Każda klasa ma odniesienie doClassLoader
. Ten kod zwraca aFile
z katalogu zasobów. WywołaniegetAbsolutePath()
go zwraca wartość absolutnąPath
.Javadoc dla
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlźródło
Nie musisz zadzierać z modułami ładującymi klasy. W rzeczywistości jest to zły nawyk wchodzenia w to, ponieważ zasoby modułu ładującego klasy nie są obiektami java.io.File, gdy znajdują się w archiwum jar.
Maven automatycznie ustawia bieżący katalog roboczy przed uruchomieniem testów, więc możesz po prostu użyć:
resourcesDirectory.getAbsolutePath()
zwróci prawidłową wartość, jeśli tego naprawdę potrzebujesz.Polecam utworzenie
src/test/data
katalogu, jeśli chcesz, aby twoje testy miały dostęp do danych przez system plików. To wyjaśnia, co robisz.źródło
Po prostu użyłbym
Path
z Java 7Schludnie i czysto!
źródło
Paths.get(...)
sugeruje (w każdym razie dla mnie), że tak nie będzie.File.separator
stałej do zbudowania łańcucha, który będzie używany jako ścieżkanew File("src/test/resources")
robi to dobrze na wszystkich platformach.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
iPaths.get("src/test/resources")
działaj dobrze dla Windows 10 dla mnie. Co ja robię źle? =)Jeśli jest to projekt wiosenny, możemy użyć poniższego kodu, aby pobrać pliki z folderu src / test / resource .
źródło
Mam projekt Maven3 przy użyciu JUnit 4.12 i Java8. Aby uzyskać ścieżkę do pliku o nazwie
myxml.xml
undersrc/test/resources
, robię to z poziomu przypadku testowego:Testowane na Ubuntu 14.04 z IntelliJ IDE. Odnośnik tutaj .
źródło
Cała zawartość
src/test/resources
jest kopiowana dotarget/test-classes
folderu. Aby pobrać plik z zasobów testowych podczas kompilacji maven, musisz załadować go ztest-classes
folderu, w ten sposób:Awaria:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- dam ci URI dotarget/test-classes
.resolve(Paths.get("somefile"))
- rozwiązujesomeFile
dotarget/test-classes
folderu.Oryginalna odpowiedź pochodzi z tego
źródło
Istnieją różnice i ograniczenia w opcjach oferowanych przez @Steve C i @ ashosborne1. Uważam, że należy je sprecyzować.
Kiedy możemy użyć
File resourcesDirectory = new File("src/test/resources");
:?IntelliJ IDEA
tylko, ale myślę, że wszystkie IDE działają w ten sposób. Ta konfiguracja, którą należy wykonać ręcznie, wcale nie jest dobra. Praca z kilkoma testami istniejącymi w różnych projektach maven, ale zaimportowana do jednego dużego projektu „IDE”, zmusza nas do zapamiętania tego i nie pozwala się zrelaksować i czerpać przyjemność z pracy.Rozwiązanie oferowane przez @ ashosborne1 (osobiście wolę ten) wymaga 2 dodatkowych wymagań, które należy spełnić przed uruchomieniem testów. Oto lista kroków, aby użyć tego rozwiązania:
Utwórz folder testowy („teva”) i plik („readme”) w „src / test / resources /”:
src / test / resources / teva / readme
Plik musi zostać utworzony w folderze testowym, w przeciwnym razie nie będzie działać. Maven ignoruje puste foldery.
Przynajmniej raz buduj projekt przez
mvn clean install
. Przeprowadzi również testy. Może wystarczyć uruchomienie tylko klasy testowej / metody przez maven bez budowania całego projektu. W rezultacie Twoje zasoby testowe zostaną skopiowane do klas testowych, oto ścieżka:target/test-classes/teva/readme
Następnie możesz uzyskać dostęp do folderu za pomocą kodu, który jest już oferowany przez @ ashosborne1 (przepraszam, że nie mogłem poprawnie edytować tego kodu na tej liście elementów):
Teraz możesz uruchomić test za pomocą IDE tyle razy, ile chcesz. Dopóki nie uruchomisz mvn clean. Opuści folder docelowy.
Aby utworzyć plik w folderze testowym i uruchomić maven po raz pierwszy, przed uruchomieniem testów za pomocą IDE potrzebne są kroki. Bez tych kroków, jeśli tylko w swoim IDE utworzysz zasoby testowe, a następnie napisz test i uruchom go tylko za pomocą IDE, pojawi się błąd. Uruchamianie testów za pośrednictwem mvn kopiuje zasoby testowe do target / test-klas / teva / readme i stają się one dostępne dla modułu ładującego klasy.
Możesz zapytać, dlaczego potrzebuję importować więcej niż jeden projekt maven do IDE i dlaczego tak wiele skomplikowanych rzeczy? Dla mnie jedna z głównych motywacji: trzymanie plików związanych z IDA z dala od kodu. Najpierw tworzę nowy projekt w moim IDE. To fałszywy projekt, który jest po prostu posiadaczem plików związanych z IDE. Następnie importuję już istniejące projekty maven. Zmuszam te importowane projekty do przechowywania plików IDEA tylko w moim oryginalnym fałszywym projekcie. W rezultacie nie widzę plików związanych z IDE wśród kodu. SVN nie powinien ich widzieć (proszę nie oferować konfiguracji svn / git do ignorowania takich plików, proszę). Jest to również bardzo wygodne.
źródło
.gitignore
? Wygląda również na to, że IDEA uruchamia Maven automatycznie podczas uruchamiania testów (i domyślnie ustawia prawidłowy katalog pracy$MODULE_DIR$
). Nie trzeba więc wcześniej uruchamiaćmvn test
ręcznie, wszystko działa poprawnie zarówno z Maven, jak i IDEA"src/test/resources/somefile.txt"
.Najprostsze i czyste rozwiązanie, z którego korzystam, załóżmy, że nazwa klasy testowej to
TestQuery1
iresources
katalog zawieratest
folder w następujący sposób:Aby uzyskać identyfikator URI
TestQuery1
do:Aby uzyskać identyfikator URI jednego z plików
TestQuery1
, wykonaj:źródło
Nie można używać pliku z folderu zasobów do testów w typowym przypadku. Powodem jest to, że pliki zasobów w folderze zasobów są przechowywane w słoiku. Więc nie mają prawdziwej ścieżki w systemie plików.
Najprostszym rozwiązaniem może być:
TemporaryFolder
fromJUnit
może służyć do tworzenia plików tymczasowych i usuwania ich po zakończeniu testu. Klasy zguava
biblioteki służą do kopiowania folderu zasobów formularza pliku.Zauważ, że jeśli użyjemy podfolderu w folderze zasobów, takiego jak
good
jeden, nie musimy dodawać prowadzącego/
do ścieżki zasobów.źródło
Wykonaj następujące czynności, aby wstrzyknąć Hibernację ze sprężyną do testów jednostkowych:
Jeśli nie masz
hibernate.cfg.xml
prezentu wsrc/test/resources
folderze, automatycznie wróci dosrc/main/resources
folderu w folderze.źródło
Użyj .getAbsolutePath () na swoim obiekcie File.
źródło
getFile()
zwraca instancję pliku. Mówi, żegetAbsolutePath()
jest używany w instancji obiektu File.Dzięki Spring możesz łatwo odczytać go z folderu zasobów (main / resources lub test / resources):
Na przykład utwórz plik:
test/resources/subfolder/sample.json
źródło
źródło