繁体   English   中英

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

[英]How do you unit-test controllers that oauth?

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

但是对控制器进行oauth测试是另一回事。 例如,如果我想因为Oauth到GData而获得授权URL,则必须部署Web应用程序,因为Google仅接受来自我的域(Web应用程序的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;
}

听起来您有一个组件(一个控制器)可以做很多事情。

我会分解成

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM