Java 获取getResourceAsStream的单元测试

Java 获取getResourceAsStream的单元测试,java,unit-testing,Java,Unit Testing,我有一个控制器 InputStream inStream = ControllerClass.getClass().getResourceAsStream(doc); doc是我通过httpservletrequest发送的流,它将是/doc/xxx.json。如果我想对这个控制器进行单元测试,我必须首先为上面的代码创建一个模拟资源来获取我的模拟资源。正如我所知,上面的代码将从路径project/target/classes/doc/xxx.json获取文件 如何在路径上创建一个模拟文件来对

我有一个控制器

InputStream inStream = ControllerClass.getClass().getResourceAsStream(doc); 
doc是我通过httpservletrequest发送的流,它将是/doc/xxx.json。如果我想对这个控制器进行单元测试,我必须首先为上面的代码创建一个模拟资源来获取我的模拟资源。正如我所知,上面的代码将从路径project/target/classes/doc/xxx.json获取文件


如何在路径上创建一个模拟文件来对控制器进行单元测试?

除非它是一个非常大的JSON字符串,否则不需要创建一个模拟文件来对控制器进行单元测试

只需尝试以下简单代码:

InputStream inStream = new StringInputStream(mockJsonString);
根据您最后的评论-在/doc/xxx.json处找不到文件

试试这个

InputStream inStream = new FileInputStream(new File("doc/xxx.json"));

我刚刚经历了resourceasstream如何在不同情况下表现出不同。我最终改为基本上模拟源代码,模拟实际上只是返回了我们想要在相关测试中使用的JSON或HTML

这建议还不够。代码更简洁,您不需要试图弄清楚文件是在类路径中还是在类路径之外。如果您的文件很大,它可能不那么吸引人,但您甚至可以创建这些组合文件的模块化版本,例如:

new MockResponse.Builder().addHeader(headerJSON).body(forecastTable).build();
当然,这些元素在某些地方是字符串,但是您可以做很多组织工作,坦率地说,这是您的示例测试文件所没有的

我之所以重新考虑这个问题,是因为我花了很多时间研究在命令行gradle下运行的测试,而不是IntelliJ内部。但后来我想到了因果报应是如何在角度上起作用的:当你根据预期的反应编写测试时,你实际上是在说这样的话:

.when("/forecasts").respond("{ forecasts: [ { "mon", 75º }, { "tue", "78º" } ... ]")

因此,将响应模拟为文字片段的想法在这里被认为是可以接受的。

因为它是一个spring控制器,我将使用mockmvc.performeget/doc/xxx.json…测试控制器。然后检查响应是否与模拟文件相同。如何在我的情况下使用你的建议?因为控制器将调用InputStream inStream=ControllerClass.getClass.getResourceAsStream/doc/xxx.json;在控制器内部找不到文件/doc/xxx.json…因为它是一个spring控制器,我将使用mockmvc.performeget/doc/xxx.json…测试控制器。然后检查响应是否与模拟文件相同。如何在我的情况下使用你的建议?因为控制器将调用InputStream inStream=ControllerClass.getClass.getResourceAsStream/doc/xxx.json;在控制器内部,找不到位于/doc/xxx.json的文件