2009-09-23 142 views
0

我喜歡Spring MVC,因爲你可以單元測試你的控制器。你如何測試oauth的單元測試控制器?

但測試控制器,OAuth是另一回事。舉例來說,如果我想獲得授權的URL,因爲我想使用OAuth的GData,我將不得不部署web應用程序,因爲谷歌將只接受來自我的域名(我的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; 
} 

回答

2

這聽起來像你有一個組件(控制器)做多的東西。

我會闖入

  1. 控制器
  2. 與谷歌通信基於OAuth的認證服務這

後者應注射到控制器中,與春天否則剛纔的一切。

這使您可以在一個單元測試,模擬出你的控制器時的OAuth組件返回的值不同的行爲方式。

對於實際使用谷歌測試整合,你可以做兩兩件事:解析谷歌的OAuth響應服務的

  1. 單元測試 - 模擬出的是不實際的消息傳輸,這樣就可以測試代碼當google返回某種類型的XML(我假設這是用XML完成的,但是不管技術採用相同的原則)還是另一種類型時,消息解析器的行爲如何。發送和接收到google組件的
  2. 實際的集成測試 - 這可能是因爲你所提到的侷限性更難。

所以,即使他們限制訪問某些域名,那麼你可以單元測試拼圖的大部分,並希望只有一個小的片段,必須「在野外」進行測試。

或者,您可以在您的測試環境中註冊一個域的其他帳戶嗎?無論如何,你仍然應該把這些代碼分解成更小的組件。

+1

我的控制器其實很簡單,它只是在Google獲得授權Url(請參閱我的更新後的帖子)。 單位,測試控制器,我從模型得到authUrl,做一個assertNotNull(authUrl),因爲它沒有從我的域名來這當然會失敗。 但是,當我作爲web應用運行並在localhost:8080上手動測試時,jsp會打印一個url!當我把網址放在瀏覽器中時,它會引導我進入一個頁面,要求我授權我製作的網絡應用程序。 X( – Jeune 2009-09-23 19:37:31