使用Java 8.
基本上,在单元测试(junit)中我有这个代码:
callSomeCode();
assertTrue(new File(this.getClass().getResource("/img/dest/someImage.gif").getFile()).exists());
在callSomeCode()
中,我有这个:
InputStream is = bodyPart.getInputStream();
File f = new File("src/test/resources/img/dest/" + bodyPart.getFileName()); //filename being someImage.gif
FileOutputStream fos = new FileOutputStream(f);
byte[] buf = new byte[40096];
int bytesRead;
while ((bytesRead = is.read(buf)) != -1)
fos.write(buf, 0, bytesRead);
fos.close();
第一次运行测试时,this.getClass().getResource("/img/dest/someImage.gif")
会返回null
,尽管文件已经很好地创建了。
第二次(当文件在第一次测试运行期间已经创建然后被覆盖时),它是非空的并且测试通过。
如何让它第一次运作?
我应该在IntelliJ中配置一个特殊设置来自动刷新创建文件的文件夹吗?
请注意,我有这个基本的maven结构:
--src
----test
------resources
答案 0 :(得分:2)
正如nakano531的评论所指出的那样 - 你的问题不是文件系统,而是类路径。您正在尝试使用类加载器通过调用getClass().getResource(...)
方法来读取文件,而不是使用直接访问文件系统的类来读取文件。
例如,如果您已经按照以下方式编写了测试:
callSomeCode();
File file = new File("src/test/resources/img/dest/someImage.gif");
assertTrue(file.exists());
你现在不会遇到这个问题。
您的另一个选择是通过nakano531提供的链接实施解决方案:https://stackoverflow.com/a/1011126/1587791
答案 1 :(得分:0)
我陷入了同样的情况,一种解决方法是延迟行的执行,该行从运行时创建的文件中读取行。使用这个:
callSomeCode();
Thread.sleep(6000);
assertTrue(new File(this.getClass().getResource("/img/dest/someImage.gif").getFile()).exists());