使用Mockito进行MockingUriInfo,结果与预期不同



我正在尝试模拟UriInfo对象以传递给一个restful服务方法,如果具有正确QueryParams的成功请求,则响应应为List,如果发生任何错误或失败,则应为StatusResponse。我正在发送一个正确的请求,但控制器接收到它,就好像我发送了一个没有QueryParam的错误请求一样,并给我一个状态响应对象。

RestController.java

服务方式:

public Response getObjectives(@Context UriInfo info) {
try {
return Response.ok(objectiveService.getObjectives(info.getQueryParameters())).build();
} catch (Exception e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(StatusResponse.EXPIRED_SESSION).build();
}
}

RestControllerTest.java

private UriInfo mockUriInfo(String uri) throws URISyntaxException {
UriInfo uriInfo = Mockito.mock(UriInfo.class);
Mockito.when(uriInfo.getRequestUri()).thenReturn(new URI(uri));
return uriInfo;
}

@Test
@DataSet({ "/datasets/object_target_type.xml", "/datasets/st_objective_levels.xml", "/datasets/st_objectives.xml", "/datasets/st_related_objectives.xml" })
@Transactional(TransactionMode.ROLLBACK)
public void testGetObjectives() throws Exception {
UriInfo uriInfo = mockUriInfo("http://localhost:8080/v1.0/objectives?planId=987&level=2");
Response response = restController.getObjectives(uriInfo);
Object objs = response.getEntity();
ReflectionAssert.assertLenientEquals(objs, Arrays.asList(
    new Objective(2L, "Obj1", new Level(2L), 987L, new TargetType(1L), 222d, 3),
    new Objective(3L, "Obj2", new Level(2L), 987L, new TargetType(1L), 333d, 3),
    new Objective(5L, "Obj5", new Level(2L), 987L, new TargetType(1L), 555d, 3),
    new Objective(6L, "Obj6", new Level(2L), 654L, new TargetType(1L), 666d, 3))
                    );
}

但实际的响应是StatusResponse,就好像在RestController方法中抛出了异常一样。

我认为它未能模拟UriInfo,也看不到QueryParams。

帮帮我,嘲笑UriInfo对象

有什么错

因为没有模拟getQueryParameters(),所以看起来得到了一个空指针异常。

你的嘲讽代码可能看起来像这样(为了清晰起见,我把它做得不那么简洁):

private UriInfo mockUriInfo(String uri) throws URISyntaxException {
    UriInfo uriInfo = Mockito.mock(UriInfo.class);
    URI uriObject = new URI(uri);
    Mockito.when(uriInfo.getRequestUri()).thenReturn(uriObject);
    Map<String,String> queryParametersMap = this.parseQueryParameters(uriObject.getQuery());
    Mockito.when(uriInfo.getQueryParameters()).thenReturn(new MultivaluedHashMap(queryParametersMap));
    return uriInfo;
}
private Map<String,String> parseQueryParameters(String query) {
    String[] params = query.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params)
    {
        String[] pair = param.split("=");
        String name = pair[0];
        String value = pair[1];
        map.put(name, value);
    }
    return map;
}

相关内容

  • 没有找到相关文章

最新更新