使用测试度量代码质量
作者:网络转载 发布时间:[ 2013/6/17 10:36:25 ] 推荐标签:
二、静态方法对修改开放,对“测试”关闭
使用静态方法非常简单,无需实例化并传递对象,在哪里都可以直接使用,但如果过度依赖它们,在测试中不好办了。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response) {
if (SessionUtils.isUnexpired(request)) {
return true;
} else {
//在response中输出alert语句
}
}
由于在静态方法中对保存在session中的属性做了计算和校验,要对其进行测试需要事先在session中填充很多信息。
@Test
public void returnTrueWhenUserSessionIsNotExpired() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpSession session = new MockHttpSession();
request.setSession(session);
session.set......blablabla
assertTrue(target.preHandle(request));
}
@Test
public void printAlertAndreturnFalseWhenUserSessionIsExpired() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpSession session = new MockHttpSession();
request.setSession(session);
session.set......blablabla
assertFalse(target.preHandle(request, response));
assertEquals(ALERT, response.getContentAsString());
}
由于静态方法属于类,无法通过子类化并覆写的方式在测试时替换,即使测试重点并非SessionUtils.isUnexpired(req)本身,但由于它是一个必经步骤,你不得不为其准备完整的测试数据(哪怕非常麻烦)。让我们对它改造一下吧,不过我也并不想再实现一次isUnexpired(req),耍个小花招吧

再来看测试,简单多了,我们可以用Stub/mock来替换SessionGateway的实现。
@Test
public void returnTrueWhenUserSessionIsNotExpired() throws Exception {
context.checking(new Expectations() {
{
allowing(sessionGateway).isUnexpired(request);
will(returnValue(true));
}
});
assertTrue(target.preHandle(request, response));
}
@Test
public void printAlertAndreturnFalseWhenUserSessionIsExpired() throws Exception {
context.checking(new Expectations() {
{
allowing(sessionGateway).isUnexpired(request);
will(returnValue(false));
}
});
assertFalse(target.preHandle(request, response));
assertEquals(ALERT, response.getContentAsString());
}

sales@spasvo.com