【问题标题】:@TestPropertySource windows and linux file separator@TestPropertySource windows 和 linux 文件分隔符
【发布时间】:2020-10-22 08:19:16
【问题描述】:

我有一个以此声明开头的 JUnit 测试类

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { 
        "cache.working.dir=./src/test/resources/cacheDirRepository/" } )

如何在基于 linux 的文件分隔符系统('/')和在 Windows 基本文件分隔符系统('\' ) ?

提前致谢,

【问题讨论】:

  • /有问题吗?实际上应该在任何地方都可以正常工作
  • 没有。它不适用于 native windows 平台。一种可能的解决方法是启动 linux 命令解释器。但我正在寻找一个纯 Windows 解决方案。我想执行init.bat,而不是init.sh

标签: java spring junit system-variable


【解决方案1】:

把下面的

// 独立于平台,可安全跨 Linux 和 Windows 使用

"cache.working.dir=."+File.separator+"src"+File.separator+"test"+File.separator+"resources"+File.separator+"cacheDirRepository"

【讨论】:

  • 是的。这个解决方案是有效的,但是如果你有多个类似的测试用例,那么转换所有测试用例是一项真正的工作。
  • 是的,但是您可以通过创建方法来创建通用路径 java.util.List pathParts = java.util.Arrays.asList("test", "resources", "cacheDirRepository"); genPath = StringUtils.join(pathParts, File.separator);
  • 您不能在注解声明中使用 StringUtils 静态函数。你会得到错误:The value for annotation attribute TestPropertySource.properties must be a constant expression
  • 我也不能使用 File.separator... :-(
【解决方案2】:

好的。我分享我的最后一个解决方案。也许有一个更聪明的。我会很高兴学习...

3 个动作:

  1. 我将使用占位符在运行时处理我的注释。 我的注释声明使用 文件分隔符占位符进行参数化。
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { "cache.working.dir=." + 
                                        "${file_separator}" + "src" +
                                        "${file_separator}" + "test" + 
                                        "${file_separator}" + "resources" + 
                                        "${file_separator}" + "cacheDirRepository" + 
                                        "${file_separator}", ...
  1. 我在容器中声明了一个特定的 bean 来处理这些占位符。
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }
  1. 最后,我在运行时将依赖于操作系统的文件分隔符字符作为 JVM 参数传递

适用于 Unix/MacOsX

mvn clean install -DargLine="-Dfile_separator=/"

对于 Windows

mvn clean install -DargLine="-Dfile_separator=\\"

【讨论】:

    【解决方案3】:

    java.io.File 包对此有一些变量,您可以使用它们来解决它:

    File.separator // use '/' in linux and '\' in windows
    File.separatorChar // use '/' in linux and '\' in windows
    File.pathSeparator // use ':' in linux and ';' in windows
    File.pathSeparatorChar // use ':' in linux and ';' in windows
    

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2019-12-07
      • 1970-01-01
      • 2014-04-23
      • 2018-08-20
      相关资源
      最近更新 更多