2013-01-11 82 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 
     ... 
    } 
}