当前位置: 首页 > 知识库问答 >
问题:

如何在测试期间使用“测试/资源”文件夹中的文件进行验证?

邵博远
2023-03-14

背景:我想根据模式自动验证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

共有1个答案

终翰学
2023-03-14

不要尝试通过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,因为它会失败。