Я знаю, что могу загрузить файл из src / test / resources с помощью:
getClass().getResource("somefile").getFile()
Но как я могу получить полный путь к каталогу src / test / resources , т.е. я не хочу загружать файл, я просто хочу знать путь к каталогу?
13 ответов
Попробуйте поработать с классом ClassLoader
:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("somefile").getFile());
System.out.println(file.getAbsolutePath());
ClassLoader
отвечает за загрузку в классах. Каждый класс имеет ссылку на ClassLoader
. Этот код возвращает File
из каталога ресурсов. Вызов getAbsolutePath()
возвращает его абсолютное значение Path
.
Документация Javadoc для ClassLoader
: http: // docs .oracle.com / javase / 7 / docs / api / java / lang / ClassLoader.html.
С Spring вы можете использовать это:
import org.springframework.core.io.ClassPathResource;
// Don't worry when use a not existed directory or a empty directory
// It can be used in @before
String dir = new ClassPathResource(".").getFile().getAbsolutePath()+"/"+"Your Path";
Используйте следующее, чтобы внедрить Hibernate с Spring в свои модульные тесты:
@Bean
public LocalSessionFactoryBean getLocalSessionFactoryBean() {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
localSessionFactoryBean.setPackagesToScan("com.example.yourpackage.model");
return localSessionFactoryBean;
}
Если у вас нет hibernate.cfg.xml
в папке src/test/resources
, он автоматически вернется к папке в вашей папке src/main/resources
.
List<String> lines = Files.readAllLines(Paths.get("src/test/resources/foo.txt"));
lines.forEach(System.out::println);
С помощью Spring вы можете легко прочитать его из папки ресурсов (main / resources или test / resources):
Например, создайте файл: test/resources/subfolder/sample.json
@Test
public void testReadFile() {
String json = this.readFile("classpath:subfolder/sample.json");
System.out.println(json);
}
public String readFile(String path) {
try {
File file = ResourceUtils.getFile(path);
return new String(Files.readAllBytes(file.toPath()));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Используйте .getAbsolutePath () для объекта File.
getClass().getResource("somefile").getFile().getAbsolutePath()
В общем случае нельзя использовать файл из папки ресурсов для тестов. Причина в том, что файлы ресурсов в папке ресурсов хранятся внутри jar. Таким образом, у них нет реального пути в файловой системе.
Самым простым решением может быть:
- Скопируйте файл из ресурсов во временную папку и получите путь к этому временному файлу.
- Сделайте тесты, используя временный путь.
- Удалить временный файл.
TemporaryFolder
из JUnit
можно использовать для создания временных файлов и удаления их после завершения теста. Классы из библиотеки guava
используются для копирования папки ресурсов файловой формы.
Обратите внимание, что если мы используем подпапку в папке ресурсов, например good
, нам не нужно добавлять ведущий /
к пути к ресурсу.
public class SomeTest {
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
@Test
public void doSomethinge() throws IOException {
File file = createTmpFileFromResource(tmpFolder, "file.txt");
File goodFile = createTmpFileFromResource(tmpFolder, "good/file.txt");
// do testing here
}
private static File createTmpFileFromResource(TemporaryFolder folder,
String classLoaderResource) throws IOException {
URL resource = Resources.getResource(classLoaderResource);
File tmpFile = folder.newFile();
Resources.asByteSource(resource).copyTo(Files.asByteSink(tmpFile));
return tmpFile;
}
}
Самое простое и чистое решение, которое я использую, предположим, что имя тестового класса - TestQuery1
, а в вашей папке test
есть каталог resources
, как показано ниже:
├── java
│ └── TestQuery1.java
└── resources
└── TestQuery1
├── query.json
└── query.rq
Чтобы получить URI TestQuery1
, выполните:
URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName());
Чтобы получить URI одного из файлов TestQuery1
, выполните:
File exampleDir = new File(currentTestResourceFolder.toURI());
URI queryJSONFileURI = exampleDir.toURI().resolve("query.json");
Все содержимое в src/test/resources
копируется в папку target/test-classes
. Итак, чтобы получить файл из тестовых ресурсов во время сборки maven, вам нужно загрузить его из папки test-classes
, например:
Paths.get(
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
Paths.get("somefile")
).toFile()
Сломать:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- дать вам URI дляtarget/test-classes
.resolve(Paths.get("somefile"))
- преобразуетsomeFile
в папкуtarget/test-classes
.
Исходный ответ взят из этого
У меня есть проект Maven с использованием JUnit 4.12 и Java 8. Чтобы получить путь к файлу с именем myxml.xml
в src/test/resources
, я делаю это из тестового примера:
@Test
public void testApp()
{
File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile());
System.out.println(inputXmlFile.getAbsolutePath());
...
}
Протестировано на Ubuntu 14.04 с IntelliJ IDE. См. здесь.
Если это весенний проект, мы можем использовать приведенный ниже код для получения файлов из папки src / test / resource .
File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));
Я бы просто использовал Path
a> из Java 7
Path resourceDirectory = Paths.get("src","test","resources");
С иголочки!
Не нужно возиться с загрузчиками классов. На самом деле это плохая привычка, потому что ресурсы загрузчика классов не java.io.File объектами, когда они находятся в jar-архиве.
Maven автоматически устанавливает текущий рабочий каталог перед запуском тестов, поэтому вы можете просто использовать:
File resourcesDirectory = new File("src/test/resources");
resourcesDirectory.getAbsolutePath()
вернет правильное значение, если оно вам действительно нужно.
Я рекомендую создать каталог src/test/data
, если вы хотите, чтобы ваши тесты получали доступ к данным через файловую систему. Это дает понять, что вы делаете.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.