问题描述
我有一个带有服务的简单 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);
}