我有下面的实际方法:

public ResponseEntity<Message> catEnter(@PathVariable("catId") BigInteger catId, @RequestBody Catrequest catReq, HttpServletRequest request) throws CatDataException, InvalidCatExcecatption {
    Message message = new Message();
    try {
        message = catManager.submitData(catReq.getMessage(), catId, request);
    } catch (IOException e) {
        throw new CatDataAppException(e.getMessage());
    }
    return (ResponseEntity<Message>) restResponse(message, request.getMethod());
    // Getting null pointer exception in above line
}


我正在为我的测试代码使用模仿,如下所示:

@Test
public void submitData() throws Exception {
    Message mes = new Message();
    mes.setCode("00");
    mes.setMessage("hi");
    ResponseEntity<Message> responseentity = ((ResponseEntity<Message>) catController.catEnter(BigInteger.valueOf(3431), catRequest, mockRequest));
}


我收到了空指针异常,即使我显式设置了值,消息也将变为空值?

最佳答案

这里:

对该生产代码进行调用时,您传递mockRequest

ResponseEntity<Message> responseentity = ... catController.catEnter(... mockRequest));


您的生产调用会执行以下操作:

return (ResponseEntity<Message>) restResponse(message, request.getMethod());


因此,唯一的结论是:mockRequest为空!

因此,首先要确保传递的变量不为null;喜欢:

Request mockedRequest = mock(Request.class);


或者,如果mockedRequest是测试类中的字段,请使用@Mock批注。

最重要的是;您可能想进行一些模拟规范,例如:

when(mockedRequest.getMethod()).thenReturn( whatever )


但是除此之外,您还缺少Java的许多基本知识:


命名约定:变量名称为camelCase,例如entityResponse。通常,测试的名称类似于testCatEnter,以表示所测试的方法。
您有演员表...不需要它们。
您那里有相当多的代码...未使用,例如您的测试方法中的mes声明。


长话短说:我觉得你在给自己负担沉重。首先学习基础知识;然后去买高级的Mockito东西。

09-11 20:31