Saya tahu saya dapat memuat file dari src / test / resources dengan:
getClass().getResource("somefile").getFile()
Tetapi bagaimana saya bisa mendapatkan path lengkap ke direktori src / test / resources , yaitu saya tidak ingin memuat file, saya hanya ingin tahu path direktori?
org.junit.rules.TemporaryFolder
sepanjang waktu ... tapi ... untuk menyalin dari tes / sumber yang perlu Anda ketahui, eh, jalannya!Jawaban:
Cobalah bekerja dengan
ClassLoader
kelas:A
ClassLoader
bertanggung jawab untuk memuat di kelas. Setiap kelas memiliki referensi ke aClassLoader
. Kode ini mengembalikan aFile
dari direktori sumber daya. MemanggilnyagetAbsolutePath()
mengembalikan absolutnyaPath
.Javadoc untuk
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlsumber
Anda tidak perlu dipusingkan dengan pemuat kelas. Sebenarnya itu kebiasaan buruk untuk masuk karena sumber daya loader kelas bukan objek java.io.File ketika mereka berada di arsip jar.
Maven secara otomatis menetapkan direktori kerja saat ini sebelum menjalankan tes, jadi Anda bisa menggunakan:
resourcesDirectory.getAbsolutePath()
akan mengembalikan nilai yang benar jika itu yang benar-benar Anda butuhkan.Saya sarankan membuat
src/test/data
direktori jika Anda ingin tes Anda mengakses data melalui sistem file. Ini menjelaskan apa yang Anda lakukan.sumber
Saya hanya akan menggunakan
Path
dari Java 7Rapi dan bersih!
sumber
Paths.get(...)
menyarankan (to me anyway) bahwa itu tidak akan terjadi.File.separator
konstanta untuk membangun string yang akan digunakan sebagai jalurnew File("src/test/resources")
melakukan hal yang benar di semua platform.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
danPaths.get("src/test/resources")
bekerja dengan baik pada Windows 10 untuk saya. Apa yang saya lakukan salah? =)Jika ini adalah proyek semi, kita dapat menggunakan kode di bawah ini untuk mendapatkan file dari folder src / test / resource .
sumber
Saya punya proyek Maven3 menggunakan JUnit 4.12 dan Java8. Dalam rangka untuk mendapatkan path dari file bernama
myxml.xml
bawahsrc/test/resources
, saya melakukan ini dari dalam kasus uji:Diuji pada Ubuntu 14,04 dengan IntelliJ IDE. Referensi di sini .
sumber
Semua konten di
src/test/resources
disalin ketarget/test-classes
folder. Jadi untuk mendapatkan file dari sumber daya uji selama maven build Anda harus memuatnya daritest-classes
folder, seperti itu:Kerusakan:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- memberi Anda URI untuktarget/test-classes
.resolve(Paths.get("somefile"))
- memutuskansomeFile
ketarget/test-classes
folder.Anwser asli diambil dari ini
sumber
Ada perbedaan dan kendala dalam opsi yang ditawarkan oleh @Steve C dan @ ashosborne1. Mereka harus ditentukan, saya percaya.
Kapan kita bisa menggunakan
File resourcesDirectory = new File("src/test/resources");
:?IntelliJ IDEA
saja, tapi saya pikir semua IDE bekerja seperti ini. Dan konfigurasi ini yang harus dilakukan secara manual, tidak baik sama sekali. Bekerja dengan beberapa tes yang ada di berbagai proyek pakar, tetapi diimpor ke dalam satu proyek "IDE" besar, memaksa kami untuk mengingat ini dan tidak mengizinkan untuk bersantai dan mendapatkan kesenangan dari pekerjaan Anda.Solusi yang ditawarkan oleh @ ashosborne1 (secara pribadi saya lebih suka yang ini) memerlukan 2 persyaratan tambahan yang harus dilakukan sebelum Anda menjalankan tes. Berikut adalah daftar langkah-langkah untuk menggunakan solusi ini:
Buat folder uji ("teva") dan file ("readme") di dalam "src / test / resources /":
src / test / resources / teva / readme
File harus dibuat di folder tes, jika tidak, itu tidak akan berfungsi. Maven mengabaikan folder kosong.
Setidaknya satu kali membangun proyek melalui
mvn clean install
. Ini akan menjalankan tes juga. Mungkin cukup hanya menjalankan kelas uji / metode Anda melalui pakar tanpa membangun keseluruhan proyek. Alhasil sumber daya pengujian Anda akan disalin ke kelas-kelas tes, di sini ada jalannya:target/test-classes/teva/readme
Setelah itu, Anda dapat mengakses folder menggunakan kode, yang sudah ditawarkan oleh @ ashosborne1 (Maaf, saya tidak dapat mengedit kode ini di dalam daftar item ini dengan benar):
Sekarang Anda dapat menjalankan tes Anda melalui IDE sebanyak yang Anda inginkan. Sampai Anda menjalankan mvn clean. Ini akan menjatuhkan folder target.
Membuat file di dalam folder tes dan menjalankan pakar pertama kali, sebelum Anda menjalankan tes melalui IDE diperlukan langkah-langkah. Tanpa langkah-langkah ini, jika Anda hanya di IDE membuat sumber daya pengujian, kemudian menulis tes dan menjalankannya hanya melalui IDE, Anda akan mendapatkan kesalahan. Menjalankan tes melalui mvn menyalin sumber daya pengujian ke target / kelas-tes / teva / readme dan mereka dapat diakses oleh classloader.
Anda mungkin bertanya, mengapa saya perlu mengimpor lebih dari satu proyek pakar dalam IDE dan mengapa begitu banyak hal yang rumit? Bagi saya, salah satu motivasi utama: menjaga file terkait IDA jauh dari kode. Saya pertama kali membuat proyek baru di IDE saya. Ini adalah proyek palsu, itu hanya pemegang file terkait IDE. Kemudian, saya mengimpor proyek pakar yang sudah ada. Saya memaksa proyek-proyek yang diimpor ini untuk menyimpan file IDEA hanya dalam proyek palsu asli saya. Akibatnya saya tidak melihat file terkait IDE di antara kode. SVN seharusnya tidak melihatnya (jangan menawarkan untuk mengkonfigurasi svn / git untuk mengabaikan file seperti itu, silakan). Juga sangat nyaman.
sumber
.gitignore
? Sepertinya IDEA menjalankan Maven secara otomatis saat menjalankan tes (dan menetapkan dir yang berfungsi dengan benar,$MODULE_DIR$
). Jadi tidak perlu dijalankanmvn test
secara manual sebelum itu, semuanya berfungsi baik dari Maven dan IDEA hanya dengan"src/test/resources/somefile.txt"
.Solusi paling sederhana dan bersih yang saya gunakan, misalkan nama kelas tes adalah
TestQuery1
dan adaresources
direktori ditest
folder Anda sebagai berikut:Untuk mendapatkan URI dari
TestQuery1
lakukan:Untuk mendapatkan URI dari salah satu file
TestQuery1
, lakukan:sumber
Anda tidak dapat menggunakan file dari folder sumber daya untuk pengujian dalam kasus umum. Alasannya adalah bahwa file sumber daya dalam folder sumber daya disimpan di dalam toples. Jadi mereka tidak memiliki jalur nyata dalam sistem file.
Solusi paling sederhana adalah:
TemporaryFolder
dariJUnit
dapat digunakan untuk membuat file sementara dan menghapusnya setelah pengujian selesai. Kelas dariguava
perpustakaan digunakan untuk menyalin folder sumber daya formulir file.Tolong, perhatikan bahwa jika kita menggunakan subfolder di folder sumber daya, seperti
good
satu, kita tidak perlu menambahkan mengarah/
ke jalur sumber daya.sumber
Gunakan yang berikut ini untuk menyuntikkan Hibernate dengan Spring dalam pengujian unit Anda:
Jika Anda tidak memiliki
hibernate.cfg.xml
hadiah disrc/test/resources
folder Anda, itu akan secara otomatis kembali ke yang ada disrc/main/resources
folder Anda .sumber
Gunakan .getAbsolutePath () pada objek File Anda.
sumber
getFile()
mengembalikan instance file. Dia mengatakan itugetAbsolutePath()
digunakan pada instance objek File.Dengan Spring Anda dapat dengan mudah membacanya dari folder sumber daya (baik utama / sumber daya atau tes / sumber daya):
Misalnya membuat file:
test/resources/subfolder/sample.json
sumber
sumber