我有一个带
的控制器InputStream inStream = ControllerClass.getClass().getResourceAsStream(doc);
doc是我通过httpservletrequest发送的流(它将是/doc/xxx.json)。如果我想对这个控制器进行单元测试,我必须首先为上面的代码创建一个模拟资源来获取我的模拟资源。据我所知,上面的代码将从路径project/target/classes/doc/xxx.json
中获取文件。
如何在路径上创建模拟文件以对控制器进行单元测试?
答案 0 :(得分:0)
您不需要创建模拟文件,以便对控制器进行单元测试,直到除非它是一个非常庞大的JSON字符串。
试试这个简单的代码:
InputStream inStream = new StringInputStream(mockJsonString);
根据您的上一条评论 - 在/doc/xxx.json找不到该文件
试试这个
InputStream inStream = new FileInputStream(new File("doc/xxx.json"));
答案 1 :(得分:0)
我刚刚经历了资源流如何在不同情况下表现不同的地狱。我最终改为基本嘲笑源代码,而mock实际上只返回了我们想要在有问题的测试中使用的JSON或HTML。
不能推荐这个。代码更清晰,你不是要弄清楚文件是在类路径中结束还是在类路径之外。如果你的文件很大,它可能不太吸引人,但你甚至可以创建那些组合文件的模块化版本,例如:
new MockResponse.Builder().addHeader(headerJSON).body(forecastTable).build();
当然,这些元素在某个地方会是字符串,但你可以做很多组织,坦白地说你的样本测试文件没有。
我重新考虑了这一点,因为我花了很多时间查看在命令行下在gradle下运行但在IntelliJ内部没有运行的测试。但后来我在考虑Karma如何在Angular中工作:当你针对预期的反应编写测试时,你实际上是这样说的:
.when("/forecasts").respond("{ forecasts: [ { "mon", 75º }, { "tue", "78º" } ... ]")
因此,将回复视为文字片段的想法在那里被认为是可以接受的。