2014-01-17 1 views
0

DBTEX 서버에 대한 요청을 생성하기 위해 RESTEasy 클라이언트 프레임 워크 버전 2.3.5 (필자는 강제로 사용해야하지만 아마도 최신 버전으로 업그레이드 할 수 있습니다)를 사용하고 있습니다. 나는 그것이 좋고 깨끗한 단위 테스트를 작성하는 방법을 더 잘 알아 내기 위해 많이 봤다. 필자의 요구에 맞는 InMemoryClientExecutor 클래스를 발견했습니다.RESTEasy InMemoryClient가 @FormParam을 사용하여 NPE를 throw합니다.

@POST 
@Produces({ "application/json" }) 
public abstract HighLevelDeviceGateway testMethod(@FormParam("deviceGatewayName") String param) 
      throws Exception; 

Is there a client-side mock framework for RESTEasy?

그것은 완벽하게 작동,하지만 클라이언트 코드에 메서드를 추가 할 경우 (내가 생산 코드에서이 같은 서명과 같은 방법을 가지고) :

이 답변을 참조하십시오 NPE는이 스택 추적입니다 발생합니다 : 그것은, 내가 RESTEasy가 최신 버전의 버그 시도 것

Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException 
at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:120) 
at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:88) 
at com.sun.proxy.$Proxy24.testMethod(Unknown Source) 
at com.mypackage.InMemoryClientExecutorExample.main(InMemoryClientExecutorExample.java:78) 
Caused by: java.lang.NullPointerException 
at org.jboss.resteasy.mock.MockHttpRequest.getFormParameters(MockHttpRequest.java:259) 
at org.jboss.resteasy.client.core.executors.InMemoryClientExecutor.loadHttpMethod(InMemoryClientExecutor.java:147) 
at org.jboss.resteasy.client.core.executors.InMemoryClientExecutor.execute(InMemoryClientExecutor.java:75) 
at org.jboss.resteasy.core.interception.ClientExecutionContextImpl.proceed(ClientExecutionContextImpl.java:39) 
at org.jboss.resteasy.plugins.interceptors.encoding.AcceptEncodingGZIPInterceptor.execute(AcceptEncodingGZIPInterceptor.java:40) 
at org.jboss.resteasy.core.interception.ClientExecutionContextImpl.proceed(ClientExecutionContextImpl.java:45) 
at org.jboss.resteasy.client.ClientRequest.execute(ClientRequest.java:443) 
at org.jboss.resteasy.client.ClientRequest.httpMethod(ClientRequest.java:677) 
at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:111) 
... 3 more 

그것은 나를 위해 보인다 NPE는 여전히 존재하지만, 새로운 하지만 버전은 Executor를 사용하지 않습니다.

어떤 도움 ..

if (getHttpHeaders().getMediaType().isCompatible(MediaType.valueOf("application/x-www-form-urlencoded"))) 

HTTP 헤더가 null이 아니라 미디어 타입은 내가 왜 이해가 안된다 :

일부 추가 정보를 원하시면,이에서 NPE가 cames 라인입니다 감사합니다!

답변

1

당신은 귀하의 요청에 "Content-Type"헤더를 추가하여 첫 번째 NPE 주위를 얻을 수 있습니다 :

_request.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); 

그러나,이 문제가 해결되지 않습니다.

근본적인 문제는 시도에서 getFormParameters() 결과를 호출의 InMemoryClientExecutor 잘못 formParameters의 컬렉션이 null로 밖으로 시작하기 때문에

mockHttpRequest.getFormParameters().add(key, value); 

대신

mockHttpRequest.addFormHeader(key, value); 

를 호출하는 값에서 추가 호출이다 빈 상태 (empty)의 입력 스트림을 해석한다

addFormHeader은 콘텐츠 유형 ("application/x-www-form-urlencoded")과 양식 이름/값 쌍을 디코딩 된 양식 매개 변수 모음으로 설정합니다.

슬프게도 코드의 전체 ClientExecutionContextImplClientRequest 분기가 사용되지 않는 것으로 표시되는 것으로 보입니다.이 중 하나가 수정 될 것입니다. 우리는 자원으로의 파견을 테스트하기위한 몇 가지 방법을 얻길 바랍니다. : 당신은 "보내기"양식 데이터를

_request.body(MediaType.APPLICATION_FORM_URLENCODED_TYPE, _formData); 

이 허용됩니다 :)

: S

지금, 당신은 단순히 양식 매개 변수와 MultivalueMap 수집을 구축 할 수 있으며, 요청 본문으로 설정

관련 문제