java - 如何为函数中的注释参数编写模拟
问题描述
我是模拟测试的新手。我正在努力学习,但找不到针对我的具体问题的答案。
我在其中一个控制器中有如下方法
@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;
}
}
然后测试可能如下所示(使用 Juni4):
@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);
}
}
推荐阅读
- java - 使用 ChronoUnit 从 GPS 点计算平均速度
- websphere-liberty - 如何在 websphere liberty 中调整 json 日志格式
- reactjs - 我如何从不同的静态 html 开始反应站点
- css - 光标和内容 css 属性在 IE11 中无法正常工作
- mikrotik - MikroTik GRE 防火墙规则和路由
- matlab - 结合 2 个 MATLAB 结构
- hibernate - Spring Data JPA Ccould not initialize proxy - 在 .parallel() 中的不同线程中运行时没有会话
- python - python在具有三个元素的3D图形/元组中查找连接的组件?
- 3d - 如何在3d中获得点到平面的距离?
- c# - XAML 中的自定义字符串格式