通过创建接口的模拟对象进行Java单元测试
我不知道该怎么说我想做什么,所以我提前道歉
作为工作的一部分,我目前正在为一些遗留代码编写单元测试。其中一段代码是(Java)HttpServlet,它提供了一个重新定向的URL。基本上,代码如下所示:
public class Server extends HttpServlet {
...
public void doGet(HttpServletRequest request, HttpServletResponse response) {
...
String url = "....";
.. // do some work to create that url
response.sendRedirect(url);
}
...
}
作为这个类单元测试的一部分,我想测试创建的重定向URL。所以我会按照以下思路做一些事情:
Server server = new Server();
..
server.doGet(request, response);
String url = getRedirectURL(response);
// test URL returned
...
从响应中获取“getRedirectURL”的最佳方式是什么
我目前正在使用Junit和Jmock(两个最新版本)。我创建了一个模拟HttpServletRequest,如果我知道url的预期格式,我可以轻松地创建一个模拟HttpServletResponse,并为sendRedirect(url)方法添加一个预期,但我不知道
我的尝试是创建一个模拟类,实现HttpServletResponse,它存储url的值,然后允许我稍后检索它。i、 e
private class MockHttpServletResponse implements HttpServletResponse {
String url;
public String getURL() {
return url;
}
public void sendRedirect(String url) {
this.url = url;
}
}
然而,因为它实现了一个接口,Java希望我实现HttpServletResponse中的所有方法,而我真的不想这么做
先谢谢你:)我会试着再说一遍
# 1 楼答案
您需要实现一个自定义匹配器。见Writing New Matchers
自定义匹配器允许您准确测试所需内容,但也允许您存储传递给匹配器的值,以便您以后检索:
从jmock站点:
因此,您将url值存储在calledValue中,然后通过getCalledValue()进行检索
# 2 楼答案
我猜您只是想确认sendRedirect方法是在响应模拟上调用的,但您不关心该值是什么。如果是这种情况,您可以设置如下期望:
# 3 楼答案
鉴于这一切都是在单元测试中发生的,您能否预测URL将是什么,从而匹配它?也就是说,使用matchers来提取您所关心的特性通常是值得的,这使得测试更加集中