2013-01-11 149 views
1

我使用在GlassFish和Jersey上運行的Java EE 6。使用Java EE註釋使用JUnit進行REST服務測試

如何使用一些自定義標題和其他一些請求細節來模擬對此資源的請求?

@Stateless 
@Path("/user") 
public class Resources { 

@Contex 
private HttpServletRequest request; 
.... 

@GET 
@Path("/settings") 
@Produces("application/json") 
@Consumes("text/plain") 
public AccountSettings accountSettings() { 
    //check custom headers and request content do some stuff 
    return accountSettings; 
} 

    .... 
} 

,這是我的Java代碼,但我得到res.accountSettings(),因爲要求仍然是空空指針異常。

@Mock 
HttpServletRequest request= Mockito.mock(HttpServletRequest.class); 

@Test 
public void testResources() { 
    when(request.getHeader(HTTP_AUTHORIZATION_HEADER)).thenReturn("Basic wedwd"); 
    Resources res=new Resources(); 
    AccountSettings response=res.accountSettings(); 

} 

,而不是與關鍵字創建,當我用這個話,我也得到了資源空。

@Inject Resources resources 
+0

「資源」和「請求」是如何連接的? –

+0

@Anders R. Bystrup對於我無法連接它們的問題,我嘗試將資源注入到測試類,而不是通過「新建」創建,但我仍然得到空值 – Spring

+0

您完成了大部分工作。您現在只需要進行注入 - 即您的測試方法需要設置Resources類的請求屬性。這模擬了實際的運行時行爲。 Resources類沒有爲請求設置setter嗎?如果是這樣,只需在測試方法中調用它。 – EJK

回答

0

我相信你可以做與@InjectMocks註釋遵循,它之外的任何JAXRS上下文或CDI注入的東西,它視爲一個普通的Java類。

@RunWith(MockitoJUnitRunner.class) 
public class ResourcesTest { 

    @Mock HttpServletRequest request; 

    @InjectMocks Resources res; 

    @Test 
    public void testResources() { 
     // given 
     when(request.getHeader(HTTP_AUTHORIZATION_HEADER)).thenReturn("Basic wedwd"); 

     // when 
     AccountSettings response = res.accountSettings(); 

     // then 
     ... 
    } 
}