Java 如何为函数中带注释的参数编写mockito
我不熟悉mockito测试。我正在努力学习,但找不到我具体问题的答案 我在其中一个控制器中有如下方法Java 如何为函数中带注释的参数编写mockito,java,spring,spring-boot,mockito,springmockito,Java,Spring,Spring Boot,Mockito,Springmockito,我不熟悉mockito测试。我正在努力学习,但找不到我具体问题的答案 我在其中一个控制器中有如下方法 @RequestMapping(value = /employer, method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE }) public HttpStatus saveEmployerInfo (@Valid @RequestBody EmployerI
@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
如果你想测试你的控制器,你必须在真实的实例上测试,而不是在模拟的实例上。假设您的控制器看起来像这样:
@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);
}
}
你的测试没有多大意义:1。打给SaveEmployeerInfo的电话似乎少了一个,2。一切都是模拟的,所以调用您想要在模拟实例上测试的方法肯定会给您带来错误。