有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为函数中带注释的参数编写mockito

我不熟悉mockito测试。我正在努力学习,却找不到解决我具体问题的答案

我在其中一个控制器中有如下方法

@RequestMapping(value = /employer, method = RequestMethod.POST,
                consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
public HttpStatus saveEmployerInfo (@Valid @RequestBody EmployerInfo empInfo,
                               HttpServletRequest request)
{
        String employeeId = (String) request.getAttribute(EMP_ATTRIBUTE);
        employerService.processEmpInfo(empInfo, employeeId);
        return HttpStatus.OK;
}

我试图在mockito中做到以下几点:

EmployerInfo mockEmpInfo = mock(EmployerInfo.class);
HttpServletRequest mockHttpServletRequest = mock(HttpServletRequest.class);
Controller mockController = mock(Controller.class);
when(mockController.saveEmployerInfo(Matchers.any(EmployerInfo.class), (HttpServletRequest) any(HttpServletRequest.class))).thenReturn(HttpStatus.OK);
HttpStatus responseStatus = mockController.saveEmployerInfo(Matchers.any(EmployerInfo.class),
  (HttpServletReq(mockEmpInfo, mockHttpServletRequest);
            assertEquals(HttpStatus.OK, responseStatus.OK);

我仍然遇到以下错误,无法解决此问题:

java.lang.ClassCastException: org.hamcrest.core.IsInstanceOf cannot be cast to com.xxx.model.EmployerInfo

共 (1) 个答案

  1. # 1 楼答案

    如果你想测试你的控制器,你必须在真实的实例上测试,而不是在模拟的实例上。假设你的控制器看起来像这样:

    @Controller
    public class EmployerController {
      @Autowire
      EmployerService employerService;
    
      @RequestMapping(value = /employer, method = RequestMethod.POST,
                      consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
      public HttpStatus saveEmployerInfo (@Valid @RequestBody EmployerInfo empInfo,
                                   HttpServletRequest request) {
            String employeeId = (String) request.getAttribute(EMP_ATTRIBUTE);
            employerService.processEmpInfo(empInfo, employeeId);
            return HttpStatus.OK;
      }
    }
    

    然后,测试可以如下所示(使用JUnit4):

    @RunWith(MockitoJUnitRunner.class)
    public class EmployerControllerTest {
    
      @Mock
      private EmployerService employerService;
    
      @InjectMocks
      private EmployerController controller;
    
      @Test
      public void shouldReturnHttpStatusOk() {
        // Given
        EmployerInfo mockEmpInfo = mock(EmployerInfo.class);
        HttpServletRequest mockHttpServletRequest = mock(HttpServletRequest.class);
        String employerId = "employerId"
        when(mockHttpServletRequest.getAttribute(EMP_ATTRIBUTE)).willReturn(employerId);
    
        // When
        HttpStatus status = controller.saveEmployerInfo(mockEmpInfo, mockHttpServletRequest);
    
        // Then
        verify(employerService).processEmpInfo(mockEmpInfo, employerId); 
        assertEquals(HttpStatus.OK, status);
      }  
    }