0

我喜欢 Spring MVC,因为您可以对控制器进行单元测试。

但是测试 oauth 的控制器是另一回事。例如,如果我想获取授权 url,因为我想 Oauth 到 GData,我将不得不部署网络应用程序,因为谷歌只会接受来自我的域(我的网络应用程序的 url)的授权请求,而不是我的开发环境其域是 localhost:8080。

所以现在我测试我的代码是否有效的唯一方法是部署代码并打印出我需要打印的数据。

我的控制器,它是一个多动作控制器

public ModelAndView authorize(HttpServletRequest request,
HttpServletResponse response) {

        Provider provider = getProvider(request.getAttribute("provider"));
        String authUrl = provider.getAuthUrl();     
        page.put("authUrl", authUrl);
        return new ModelAndView("setup","model",page);
}

提供程序代码,我的所有依赖项都被注入

public String getAuthUrl()
{
    oAuthParameters.setScope("http://docs.google.com/feeds/");          
    try {
       oAuthHelper.getUnauthorizedRequestToken(oAuthParameters);
    } catch (OAuthException e) {
        page.put("authUrl", CANNOT_CONNECT_TO_GOOGLE);
    }
    String oAuth_Callback="[callback url]";
    try {
        oAuth_Callback.concat("?oauth_token_secret=").concat(
            java.net.URLEncoder.encode
           (oAuthParameters.getOAuthTokenSecret(), "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        page.put("authUrl",INTERNAL_ERROR);
    }

    oAuthParameters.setOAuthCallback(oAuth_Callback);
    String authUrl = oAuthHelper.createUserAuthorizationUrl(oAuthParameters);
    return authUrl;
}
4

1 回答 1

2

听起来您有一个组件(控制器)在做多项事情。

我会把它分解成

  1. 控制器
  2. 与 Google 通信的 OAuth 服务

后者应该注入到您的控制器中,就像 Spring 中的其他所有内容一样。

这允许您在单元测试中模拟 OAuth 组件返回不同值时控制器的行为。

为了实际测试与 Google 的集成,您可以做两件事:

  1. 解析 Google OAuth 响应的服务的单元测试 - 模拟执行实际消息传输的代码,以便您可以测试消息解析器在 google 返回某种类型的 XML 时的行为(我假设这是使用 XML 完成的,但无论技术如何,相同的原则都适用)与另一种类型。
  2. 发送和接收到 google 的组件的实际集成测试 - 由于您提到的限制,这可能会更难。

因此,即使他们限制对某些域的访问,您也可以对拼图的大部分部分进行单元测试,并希望只有一小部分必须“在野外”进行测试。

或者,您可以在测试环境中为域注册不同的帐户吗?无论哪种方式,您仍然应该将此代码分解为更小的组件。

于 2009-09-23T18:53:11.900 回答