如何处理 Maven 和 Intellij 之间的 Junits 中的相对路径

2022-08-31 22:42:57

我有一个带有模块的 maven 项目

/myProject
pom.xml
    /myModule
    pom.xml
       /foo
       bar.txt

考虑一下 myModule 中的一个 Junit,它需要打开 bar.txt,对于 maven,baseir 是模块目录。

所以要打开文件栏.txt

  new File("foo/bar.txt")

当您执行时,这很有效,但是当您在 intellij 中启动相同的 junit 时,它会失败,因为 Intellij 在项目目录中设置了 baseir,而不是模块目录。mvn test

Intellij 尝试打开而不是myProject/foo/bar.txtmyProject/myModule/foo/bar.txt

有没有办法解决这个问题?


答案 1

受纪尧姆启发的解决方案:

在设置值和Intellij将设置所有 junits 中的相对路径,就像 Maven 一样。Run->Edit configuration->Defaults->JUnit->Working directory$MODULE_DIR$


答案 2

如果要保留代码,可以尝试更改运行/调试配置中的工作目录(组合框中的第一个条目,可以访问要运行的内容) 将其设置为模块根目录。但更喜欢另一种建议的方法:

ClassLoader.getSystemResourceAsStream(youPath) 

或者我更喜欢:

getClass.getResource(youPath)

getClass.getResourceAsStream(youPath)

路径中的前导“/”表示项目的工作目录,而不带“/”表示与当前类的相对目录。

我将最后一个解决方案用于测试:我将测试数据资源放在与测试源相同的包级别,或者放在子目录中以避免包太乱。

通过这种方式,我可以进行简单的调用,而无需复杂的路径,也不必处理工作目录:

project-root  
  - module A  
    - src  
      - test
        - rootfile.txt  
        - my-complicated-package-naming-root
          - mypackage
            - Test.java
            - testResource.xml  

我可以这样获取文件:

final URL rootfile= Test.class.getResource("/rootfile.txt");
final URL testResource= Test.class.getResource("testResource.xml");

推荐