Spring Boot Controller Test with Mock Service 不使用模拟服务

问题描述

我有一个带有服务的简单 RestController,我想通过为服务提供一个模拟实现来测试控制器。 但是,当我运行测试时,我在 resultActions = mockmvc.perform(get("/user")); 对象中得到一个空响应。 这是我的代码控制器

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/user")
    public ResponseEntity<List<String>> getUsers(){
        return ResponseEntity.ok().body(userService.getUsers());
    }

}

控制器测试

@RunWith(springrunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {

    @MockBean
    UserService userService;

    private final Logger log = LoggerFactory.getLogger(UserControllerTest.class);
    @Autowired
    mockmvc mockmvc;

    @Before
    public void init(){
        List<String> usrs = new ArrayList<>();
        usrs.add("JUNIT-USER");
        userService = Mockito.mock(UserService.class);
        when(userService.getUsers()).thenReturn(usrs);
    }

    @Test
    public void test1() throws Exception {
        ResultActions resultActions = mockmvc.perform(get("/user"));
        resultActions.andDo(mvcResult -> {
            log.info(mvcResult.getResponse().getContentType());
            log.info(mvcResult.getResponse().getContentAsstring());
            log.info(String.valueOf(mvcResult.getResponse().getContentLength()));

        });
        resultActions
        .andExpect(status().isOk())
        .andExpect(mockmvcResultMatchers.content().json("[\"JUNIT-USER\"]"));
    }

}

测试中日志语句的输出如下:

2021-02-24 15:23:16.161  INFO 22197 --- [           main] com.vi.learn.UserControllerTest      : application/json
2021-02-24 15:23:16.161  INFO 22197 --- [           main] com.vi.learn.UserControllerTest      : []
2021-02-24 15:23:16.161  INFO 22197 --- [           main] com.vi.learn.UserControllerTest      : 0

测试因此失败并出现以下断言错误java.lang.AssertionError: []: Expected 2 values but got 0

在这里做错了什么?

解决方法

现有的两种方法

  • 使用mock()方法
  • 使用@MockBean 注释

@MockBean
UserService 用户服务;
要么
userService = Mockito.mock(UserService.class);

您必须选择其中之一,因此只需使用 @MockBean :

 @Before
public void init(){
    List<String> usrs = new ArrayList<>();
    usrs.add("JUNIT-USER");
    when(userService.getUsers()).thenReturn(usrs);
}