unit-testing - 如何在 ResponseEntityExceptionHandler @ControllerAdvice 中模拟服务
问题描述
我有Controller
:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService= userService;
}
@PostMapping(value = "/login")
public UserDto login(@RequestBody UserDto user) {
return userService.getUserWithAuth(user);
}
}
我有ControllerAdvice
:
@Slf4j
@ControllerAdvice
public class ExceptionHandlerAdvice extends ResponseEntityExceptionHandler {
private final ErrorMessagesService errorMessagesService;
@Autowired
public ExceptionHandlerAdvice(ErrorMessagesService errorMessagesService) {
this.errorMessagesService = errorMessagesService;
}
@ExceptionHandler(SomeException.class)
protected ResponseEntity<RestResponse<RestResponse.RestError>> handleSomeException(SomeException e) {
ErrorMessage messages = errorMessagesService.findByCode(e.getCode());
RestResponse.RestError restError = new RestResponse.RestError(e.getCode(), formatErrorMessage(messages));
return ResponseEntity.ok().body(new RestResponse<>(restError, null));
}
}
我为我的控制器编写 UnitTest:
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean(name = "mockUserService")
private UserService userService;
private UserDto userDtoResponse;
private UserDto userDtoRequest;
@Before
public void init() {
cashierDtoRequest = new UserDto();
userDtoRequest.setLogin("Test");
userDtoRequest.setPassword("Test");
userDtoResponse= new UserDto();
userDtoResponse.setLogin("Test");
userDtoResponse.setPassword("Test");
userDtoResponse.setAuthToken("123");
when(userService.getUserWithAuth(userDtoRequest)).thenReturn(userDtoResponse);
}
@Test
public void shouldReturnDefaultMessage() throws Exception {
mockMvc.perform(post("/api/user/login")).andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.login").value(userDtoResponse.getLogin()))
.andExpect(jsonPath("$.authToken").value(userDtoResponse.getAuthToken())));
}
但是当我开始测试时,我得到了异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'mypackeg.ErrorMessagesService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
解决方案
尝试@WebMvcTest
使用注释选项排除创建 bean
@WebMvcTest(controllers = UserController.class,
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = ExceptionHandlerAdvice.class ))
推荐阅读
- javascript - 将别名 @ 导入重构为相对路径
- javascript - 是否可以在 Chart.js 中生成圆形(圆形)形雷达图?
- python - 视图 news.views.Comment 没有返回 HttpResponse 对象。它返回 None 而不是
- html - 如何在 Bootstrap 4(!)导航栏中居中导航栏品牌链接?
- laravel - Laravel 中间件身份验证重定向
- sql - 为 datediff 指定的参数 1 无效
- javascript - JavaScript - 不同浏览器中的不同执行/加载顺序
- ssl - 密码验证失败
- r - ggplot中的不同构面标题
- javascript - 如何构建安全的图片投票系统