我需要以某种方式传递非null的HttpServletRequest或控制引发错误的HelperClass.getUser(request)(该方法确实在request.getHeader()内部,并且由于请求为null,它引发了错误并导致测试失败)。

我们想对REST API进行单元测试,因此我们迅速知道更改(或开发人员)是否破坏了它,或者我们是否有错误等,最终开始进行TDD / BDD。这些测试最终将被蚂蚁用于自动构建。我可以调用REST API并从Java设置标头,但不认为这将是单元测试?取决于在本地主机上运行它吗?可能是错的

码:

@Path("service/")
public class Service {
static DataAccess da = null;
@javax.ws.rs.core.Context HttpServletRequest request;

//constructor where doa will be mock object
public Service(DataAccess dao){
da = dao;
}

@GET
@Path("custom-object/{date}/{batch}")
@Produces({"application/xml", "application/json", "application/x-protobuf"})

//Method to test
public CustomObject getCustomObject(
@PathParam("date") String date,
@PathParam("batch") int batch,
@QueryParam("type") String type) {
String user = HelperClass.getUser(request); // this is causing me issues
//da will be a mock object
CustomObject returnedVal = da(user,DatatypeConverter.parseDateTime(date).getTime(), batch, artifactType);
return returnedVal;
 }
}


使用junit / mockito进行测试(很高兴使用powermock作为解决方案):

@Test
public void testGetCustomObject() {
    System.out.println("getCustomObject");

    //Arrange
    DataAccess da = mock(DataAccess.class);
    Service instance = new Service(da);
    String date = "2010-04-05T17:16:00Z";
    int batch = 0;
    String type = "";

    CustomObject expResult = null;
    //Act
    CustomObject result = instance.getCustomObject(date, batch, type);
    //Assert
    assertEquals(expResult, result);
}


如果我对String user="123";进行硬编码,则测试通过。在编写有用的测试之前,我需要克服这个问题。任何人都可以提供示例代码来模拟/控制此代码行,以有效地将user设置为非空字符串(此行String user = HelperClass.getUser(request);在每个API方法中)

最佳答案

为了构造HttpServletRequest,您可以使用一些模拟对象,例如Spring的MockHttpServletRequest。

或者,您可以重构您的帮助器类,并使g​​etUser()方法成为非静态方法,并在单元测试中使用Mockito对其进行模拟。

10-05 21:12
查看更多