使用请求头和遗留代码对java REST API进行单元测试
我需要以某种方式传入一个非空的HttpServletRequest或控制HelperClass。正在抛出错误的getUser(request)(该方法内部没有request.getHeader(),当请求为null时,它抛出错误并使测试失败)
我们想对REST API进行单元测试,这样我们就可以很快知道是否有更改(或开发人员)破坏了它,或者是否有bug等,最终开始执行TDD/BDD。这些测试最终将用于ant的自动化构建。我可以从java调用REST API并设置头文件,但我不认为这是一个单元测试吗?是否取决于在本地主机上运行它?这可能是错的
代码:
@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);
}
如果我硬编码^{user
设置为非空字符串(每一个API方法中都有这一行String user = HelperClass.getUser(request);
)
# 1 楼答案
您可以尝试使用REST assured库来帮助单元测试REST服务
# 2 楼答案
为了构造HttpServletRequest,可以使用一些模拟对象,比如Spring的MockHttpServletRequest
或者可以重构helper类,使getUser()方法非静态,并在单元测试中使用Mockito对其进行模拟