获取getResourceAsStream的单元测试

时间:2014-04-09 22:29:05

标签: java unit-testing

我有一个带

的控制器
InputStream inStream = ControllerClass.getClass().getResourceAsStream(doc); 

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

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

2 个答案:

答案 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º" } ... ]")

因此,将回复视为文字片段的想法在那里被认为是可以接受的。