2013-07-04 40 views
1

我必須處理一些遺留代碼。有一點,我需要一個功能,如Guice ServletScopes.scopeRequest和@RequestParameters測試時

NewCodeAccessor.get()它給我一個從Guice獲得的對象。

public class NewCodeAccessor { 
    @Inject 
    public static Provider<PageDataHandle> pageDataHandleProvider; 

    public static PageDataHandle get() { 
     return pageDataHandleProvider.get(); 
    } 
} 

Guice被初始化並且在這個類中被請求靜態注入。

在生產代碼這工作正常,但現在我嘗試測試它。 PageDataHandle是請求範圍,所以我的測試是這樣的:

@Before 
public void setUp() { 
    Injector createInjector = Guice.createInjector(new ServletModule(), 
     new AppModule()); 
} 

@Test 
public void testGetInjector() throws Exception { 

    // put it inside a callable to wrap it in a request scope, as it would 
    // usually be done in a request on the server 
    Callable<PageDataHandle> scopeRequest = ServletScopes.scopeRequest(
      new Callable<PageDataHandle>() { 
       @Override 
       public PageDataHandle call() throws Exception { 
        PageDataHandle data = NewCodeAccessor.get(); 
        return data; 
       } 
      }, Collections.<Key<?>, Object> emptyMap()); 
    PageDataHandle data = scopeRequest.call(); 
    assertTrue(data != null); 
} 

這仍然有效,只要PageDataHandle或者它的依賴不請求注射請求參數:

@Inject @RequestParameters Map<String, String[]> requestParameters 

這裏我得到OutOfScope異常: com.google.inject.ProvisionException:吉斯提供錯誤:

1)錯誤定製商,com.google.inject.OutOfScopeException:無法訪問scoped>對象。我們目前不在HTTP Servlet請求中,或者您可能忘記>將com.google.inject.servlet.GuiceFilter作爲servlet過濾器應用於此請求。

我想的東西加上我自己的測試模塊,像這樣:

bind(new TypeLiteral<Map<String, String[]>>() { 
    }).annotatedWith(com.google.inject.servlet.RequestParameters.class) 
    .toInstance(parameters); 

但是,這並不工作,因爲requestParameters的已經被ServletRequest中的約束。

我可以做的是如下:我省略了爲我的測試創建的注入器中的ServletModule,並將RequestScope綁定到我自己的自定義作用域。然後RequestParameters不會被任何其他人綁定,所以我可以創建自己的綁定來模擬。但這看起來不太好。任何人都可以告訴我如何正確地做到這一點?謝謝!

回答

0

我肯定會建議在測試期間避開ServletModule(集成測試除外)。另一種做法是做ServletScopes.scopeRequest()這將爲您創建一個虛假的請求範圍。

+0

感謝您的回答,但它是一個集成測試,正如我寫的,我已經在使用'ServletScopes.scopeRequest()'方法。但我有點解決了這個問題。我現在把'@ RequestParameters'放在另一個類中,然後我就嘲笑了。不是一個令人滿意的解決方案,但至少有一些東西 – jcvj