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

从resource dir获取单元测试的文件,但获取prod的绝对路径

姜淇
2023-03-14

我有一个springboot命令行应用程序,其中一个生产命令行参数是绝对基本路径。对于这个例子,我们称之为

“/var/batch/”

我正在为我的作品设定基本路径。像这样的yml文件有一个默认值。

公司: base Path:${base Path:/var/默认/}

然后,我有一个应用程序Config.java文件,它使用该基本路径来创建一堆类似的文件路径。

@ConfigurationProperties(prefix = "company")
public class ApplicationConfig {

    private String basePath;

    public String getPrimaryCarePath() {
        return basePath + "ADAP-2-PCProv.dat";
    }

    public String getPrimaryCareDetailPath() {
        return basePath + "ADAP-2-" + getBatchNo() + ".det";
    }

    ... additional files. 

}

最后,文件路径像这样被传递到我的css解析器中。

public List<T> readCsv() throws IOException {

    try (BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(filePath))) {
        return new CsvToBeanBuilder(bufferedReader)
                .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
                .withType(subClass)
                .withSeparator('\t')
                .withIgnoreLeadingWhiteSpace(true)
                .build().parse();
    }
}

现在在生产中一切正常,但是当试图运行突变测试时,我们面临一些问题。看起来csv解析器正在寻找绝对路径,而不是相对路径。我们的application-test.yml文件中有以下路径。

company:
  basePath: src/test/resources/

我们所有的测试文件都存储在测试资源包中,所以我的问题是如何使用填充应用程序配置的测试资源的相对路径。java文件,同时仍然能够使用生产的绝对路径?我想我可以使用ClassPathResource用测试设置覆盖basepath,但想知道是否有更好的方法。

共有1个答案

谷梁淇
2023-03-14

您需要两种配置:一种用于资源,另一种用于绝对路径。

我建议添加一个新的属性app.file.path.type,具有值资源绝对。您可以定义一个名为FileProvider的新接口。

public interface FilePathProvider(){
    Path getFilePath();
}

您可以使用@conditionalnproperty定义两个不同的bean,并设置文件路径策略:

@Configuration
public class ApplicationConfig{

      @Bean
      @ConditionalOnProperty(
            name = "app.file.path.type", 
            havingValue = "absolute")
      public FilePathProvider absoluteFilePathProvider(ApplicationConfig applicationConfig){
           return () -> Paths.get(applicationConfig.getBasePath());
      }

     @ConditionalOnProperty(
            name = "app.file.path.type", 
            havingValue = "resources")
      @Bean
      public FilePathProvider resourceFilePathProvider(ApplicationConfig applicationConfig){
           return () -> Paths.get(this.getClass().getClassLoader().getResource(applicationConfig.getBasePath()).getPath());
      }
} 

在开发和测试模式下,您将拥有应用程序。文件路径type=resources并且在生产中您将拥有应用程序。文件路径类型=绝对值。这种方法的优点是,在开发中也可以将属性设置为absolute

 类似资料:
  • 问题内容: 是否有任何API可以从绝对文件路径检索文件名? 例如来自 我知道它可以像字符串操作一样工作, 但是我想知道还有没有像Java 这样的“正式”方式可以做到这一点。 NodeJS从绝对路径获取文件名? 问题答案: 使用模块的方法: 这是上面示例的文档。

  • 本文向大家介绍获取Java中文件的绝对路径,包括了获取Java中文件的绝对路径的使用技巧和注意事项,需要的朋友参考一下 方法java.io.File.getAbsolutePath()用于获取字符串形式的文件的绝对路径。此方法不需要任何参数。 演示此的程序如下所示- 示例 上面程序的输出如下- 输出结果 现在让我们了解上面的程序。 使用方法java.io.File.getAbsolutePath(

  • 我也试着做 而我不断得到这个结果。

  • 我的项目中有一个名为x.txt的文件,它与一个接受x并读取x的文件位于同一目录中。但是,当使用JUnit测试时,如果我在不同的PC上测试,它将具有不同的文件x.txt的绝对路径 我如何做到这一点,使我不需要输入绝对文件路径,但可以硬编码的相对文件路径使用?

  • 本文向大家介绍JAVA获取文件绝对路径的方法,包括了JAVA获取文件绝对路径的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JAVA获取文件绝对路径的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Java程序设计有所帮助。