【问题标题】:Can't open ressource file in Arquillian test无法在 Arquillian 测试中打开资源文件
【发布时间】:2015-12-15 08:33:32
【问题描述】:

我想在我的集成测试中使用 arquillian 读取一个测试 CSV 文件 (xxx.csv)。我正在按如下方式打包我的档案:

@Deployment
public static WebArchive createDeployment() {
    WebArchive archive = ShrinkWrap.create(WebArchive.class);
    archive.addClasses(FileReader.class, FileWriteService.class, MockDataFactory.class, CSVFileReader.class, ExcelFileReader.class);
    archive.addAsResource("config.properties").addAsResource("xxx.csv");
    System.out.println(archive.toString(true));
    return archive;
}

印刷品向我展示的地方:

> 7fadc596-9353-4cac-aacc-cf5ec5d94c16.war: /WEB-INF/
> /WEB-INF/classes/ /WEB-INF/classes/config.properties
> /WEB-INF/classes/com/ /WEB-INF/classes/com/goodgamestudios/
> /WEB-INF/classes/com/goodgamestudios/icosphere/
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/CSVFileReader.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/ExcelFileReader$SheetHandler.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/ExcelFileReader.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/ExcelFileReader$xssfDataType.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/ExcelFileReader$1.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileReader/FileReader.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileWriter/
> /WEB-INF/classes/com/goodgamestudios/icosphere/service/fileWriter/FileWriteService.class
> /WEB-INF/classes/com/goodgamestudios/icosphere/datamodel/
> /WEB-INF/classes/com/goodgamestudios/icosphere/datamodel/MockData/
> /WEB-INF/classes/com/goodgamestudios/icosphere/datamodel/MockData/MockDataFactory.class
> /WEB-INF/classes/xxx.csv

如您所见,文件显然在存档中(最后一行)。

现在我正在尝试打开它。我试过了:

private File getFile(String filename) throws IOException {
    return convertInputStreamToFileHelper(getClass().getResourceAsStream(filename), filename);
}

new File(this.getClass().getResource("/xxx.csv").getFile()

new File("/xxx.csv")

new File("xxx.csv")

但没有一个会起作用。

【问题讨论】:

  • 你在运行什么应用服务器?您是在哪里尝试打开文件,在您的测试中,还是在同样打包在 .war 文件中的类中?

标签: java file archive jboss-arquillian shrinkwrap


【解决方案1】:

你可以得到InputStream:this.getClass().getResourceAsStream("/xxx.csv"),但是不能在war里面得到打包资源的File对象。如果您需要 File 对象,您可以将 InputStream 内容复制到 tmp 文件。

【讨论】:

  • Jup,getRessourceAsStream(filename) 确实有效,谢谢!
【解决方案2】:

您必须使用文件的完整路径。为了尝试检查以下代码:

URL fileURL = this.getClass().getResource("/WEB-INF/classes/xxx.csv");
System.out.println(fileURL);

你应该得到一个与 null 不同的 URL。

请小心使用 getResource,因为我认为它区分大小写。至少我对此有意见。

【讨论】:

  • Url 为空。
  • 我做了一个测试,并使用上一条评论中的路径...也许你尝试手动打开战争并检查文件是否真的存在?我知道你已经在跟踪中检查过了,但只是为了确保。
【解决方案3】:

我认为这始终取决于您使用的应用程序服务器及其类路径设置!

F.ex.这里我在 test/resources 中有一个文件,我将目标设置为 WEB-INF/classes/file,Wildfly (JBoss) 会在其中找到它:

.addAsWebInfResource("file.txt",
                     "classes/file.txt")

使用:

final InputStream inStream = this.getClass().getClassLoader()
                                .getResourceAsStream(fileName);

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多