2013-07-04 2 views
1

일부 기존 코드를 처리해야합니다. 내가 같은 기능을 필요로하는 한 점이 있습니다Guice ServletScopes.scopeRequest 및 @RequestParameters 테스트시

Guice에서 얻은 객체를 제공하는 NewCodeAccessor.get().

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을 : Guice 제공 오류 :

1) 사용자 지정 공급자 오류, com.google.inject.OutOfScopeException : 액세스 할 수없는 scoped> 개체를 만듭니다. 현재 HTTP 서블릿 요청에 포함되어 있지 않거나 com.google.inject.servlet.GuiceFilter를이 요청에 대한 서블릿 필터로 적용하는 것을 잊었을 수도 있습니다.

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