背景:我想根据模式自动验证XML文件。为此,我在src/main/java
中创建了一个maven-project和一个XMLValidator
-class。
为了运行测试,我在src/test/java
中创建了XMLValidatorTest
。我的想法是将XML和XSD文件(我想要验证)放入src/test/resources
文件夹,并按文件名“抓取”它们。但是当我运行mvn test
时,找不到文件。
我的测试类:
public class XMLValidatorTest {
XMLValidator xmlvalidator;
// XSD is in src\test\resources\XSD\myXSD.xsd
String xsdFileNameWithPath = "XSD\\myXSD.xsd";
@Before
public void setup() {
xmlvalidator = new XMLValidator();
}
@Test
public void testValidate() {
// XML is in src\test\resources\XML\test001.xml
String xmlFileNameWithPath = "XML\\test001.xml";
assertTrue(xmlvalidator.validate(xmlFileNameWithPath, xsdFileNameWithPath));
}
}
当我运行mvn test
时,我得到了一个文件找不到的异常,例如java.io.FileNotFoundException:d:\workspace_eclipse\xsdtester\xsd\myxsd.xsd
-它在资源文件夹中。
我尝试了Maven(surefire)的解决方案:通过
-标记复制文件,从src/test/java复制测试资源,但没有效果。
<build>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
有什么建议吗?
附注。在我的XMLValidator
中,我尝试通过以下方式使用给定的文件:
Source xmlFile = new StreamSource(new File(xmlFileNameWithPath));
Source xsdFile = new StreamSource(new File(xsdFileNameWithPath));
编辑
我再次尝试使用this.getClass().getResourceAsstream()
来实现Michele Sacchetti advise。
因此,为了检索XML文件,我尝试这样做
validate (String xmlFileNameWithPath, String xsdFileNameWithPath) {
Source xmlFile;
try {
// give systemid according to: https://stackoverflow.com/questions/10997453/java-xml-validation-does-not-work-when-schema-comes-from-classpath
xmlFile = new StreamSource(getClass().getResourceAsStream(xmlFileNameWithPath), getClass().getResource(xsdFileNameWithPath).toString());
} catch (Exception e) {
System.out.println("XML is null");
return false;
}
// ... further steps, trying to get the XSD and validate them
}
// XSD is in src\test\resources\XSD\myXSD.xsd
String xsdFileNameWithPath = "XSD\\myXSD.xsd";
// XML is in src\test\resources\XML\test001.xml
String xmlFileNameWithPath = "XML\\test001.xml";
validate(xmlFileNameWithPath, xsdFileNameWithPath);
但我总是得到一个NPE,然后尝试为该文件获取streamsource
。
不要尝试通过filename访问文件,而是使用this.getClass().getResourceAsstream()
方法通过类路径
访问文件(必须省略启动/src/test/resources
)
在示例bleow文件的下面
src/test/resources/test/test.properties
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<type>jar</type>
<scope>test</scope>
</dependency>
</dependencies>
</project>
测试源
package test;
import java.io.IOException;
import java.net.URISyntaxException;
import org.junit.Test;
public class ReadFileTest {
@Test
public void readTest() throws IOException, URISyntaxException{
System.out.println(ReadFileTest.class.getResource("test.properties").toURI());
}
}
mvn清洁测试输出
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building test 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ test ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ test ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ test ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ test ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ test ---
[INFO] Surefire report directory: /Users/msacchetti/fworks/oss_projects/test/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running test.ReadFileTest
file:/Users/msacchetti/fworks/oss_projects/test/target/test-classes/test/test.properties
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.037 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.318 s
[INFO] Finished at: 2016-04-26T21:36:54+02:00
[INFO] Final Memory: 10M/245M
[INFO] ------------------------------------------------------------------------
请注意,返回路径正确地进入目标文件夹,而不是在src one中
我试图使用位于src/test/resources下的文件进行单元测试,但当我试图读取它时,我不能总是获得空指针。 我使用Spring Boot 2.0.2,JDK 10和Gradle。 我尝试了谷歌搜索问题时发现的许多代码变体,但没有成功。 我的身材。gradle看起来像这样: 我的测试是这些测试的一些变体(我尝试过的任何测试都没有成功): 测试课程如下: src\test\java\com\m
我有一个带有源代码和测试层次结构的Spring Boot应用程序。在这两个层次结构中,我都有带有属性的application.yml文件。 假设我在src application.yml中有以下内容: 在application.yml的测试中,我得到了以下内容: 我希望我的所有测试都知道test application.yml中重写的值,如果test application.yml中没有值,则将从
我在构造函数 rabbitmq配置。Springxml位于src/main/resources中,在src/main/java中加载xml的类和在src/test/java中加载xml的测试类。我尝试在src/test/resources中复制XML文件,但没有效果。 有没有办法解决这个问题?
问题内容: 我们的大多数Eclipse项目都有多个源文件夹,例如: src / main / java src /测试/ java 当您右键单击一个类并选择New JUnit Test时,新测试的默认源文件夹是“ src / main / java”(可能是项目属性中列出的第一个源文件夹)。 有什么方法可以更改新JUnit测试的默认源文件夹,以便在执行上述操作时,默认情况下将在“ src / te
问题内容: 我正在寻找在使用本地文件对Golang进行测试时应该使用的最佳实践。 通过使用本地文件,我的意思是为了测试功能,应用程序需要一些本地文件,因为该应用程序经常从这些文件中读取数据。 我不确定是否应该在使用ioutil包tempdir和tempfile函数运行测试之前自己写临时文件,还是创建一个测试文件夹? 然后从里面的内容中读取 谢谢 问题答案: 这是我当前的测试设置: 特定于单个程序包
如何使用URI从资源文件夹的子文件夹中读取文件 资源文件夹中有一些json文件,如: 现在我想在我的课堂上读这个 这是我正在尝试的。 我的东西工作正常,但我遇到的问题是我不想使用< code>toURI,因为它会失败。