你如何对oauth的控制器进行单元测试?

时间:2009-09-23 17:58:17

标签: java unit-testing google-app-engine spring-mvc oauth

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

但测试控制器oauth是另一回事。例如,如果我想获得授权网址,因为我想要Oauth到GData,我将不得不部署网络应用程序,因为Google只接受来自我的域(我的网络应用程序的网址)的授权请求,而不是我的开发环境其域名是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;
}

1 个答案:

答案 0 :(得分:2)

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

我会将其分解为

  1. 控制器
  2. 与Google通信的OAuth服务
  3. 后者应该注入你的控制器,就像Spring中的其他所有内容一样。

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

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

    1. 解析Google OAuth响应的服务的单元测试 - 模拟执行实际邮件传输的代码,以便您可以测试当Google返回某种类型的XML时您的邮件解析器的行为(我假设这是完成XML,但不管技术如何,相同的原则适用于另一种类型。
    2. 发送和接收谷歌的组件的实际集成测试 - 由于您提到的限制,这可能会更难。
    3. 因此,即使他们限制对某些域的访问,您也可以对拼图的大部分内容进行单元测试,并且希望只有一个必须“在野外”进行测试的小段。

      或者,您是否可以在测试环境中为域注册其他帐户?无论哪种方式,您仍应将此代码拆分为更小的组件。