【问题标题】:How can I mock service in ResponseEntityExceptionHandler @ControllerAdvice如何在 ResponseEntityExceptionHandler @ControllerAdvice 中模拟服务
【发布时间】:2018-12-12 21:26:07
【问题描述】:

我有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: {}

【问题讨论】:

  • 你在你的测试课上试过@MockBean ErrorMessagesService errorMessagesService吗?
  • @ Sam Brannen 是的,我试过了,现在我得到了异常:原因:java.lang.IllegalArgumentException:必须至少存在一个 JPA 元模型!如果我删除 @EnableJpaRepositories 测试工作

标签: unit-testing spring-boot spring-test spring-boot-test spring-mvc-test


【解决方案1】:

尝试通过使用注释选项排除在@WebMvcTest 中创建bean

@WebMvcTest(controllers = UserController.class,
 excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = ExceptionHandlerAdvice.class ))

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2015-02-10
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多