我想使用MockMvc测试我的REST控制器,但我总是得到一个空的身体响应。
我的AccountControllerUnitTest
看起来像这样:
@RunWith(SpringRunner.class)
@WebMvcTest(AccountRestController.class)
public class AccountRestControllerUnitTests {
@Autowired
private MockMvc mockMvc;
@MockBean(name = "dtoUtil")
private DtoUtil dtoUtil;
@MockBean
private AccountService accountService;
@Test
public void canRetrieveAll() throws Exception {
when(accountService.findAll())
.thenReturn(Collections.singletonList(AccountTestFixture.createAccount()));
this.mockMvc.perform(get("/accounts")).andDo(print())
.andExpect(status().isOk());
}}
accountService when mock
按预期工作,调用accountService.findAll()
会返回一个包含单个帐户元素的列表。
使用我的AccountRestController
:
@RestController
@AllArgsConstructor
@RequestMapping("/accounts")
public class AccountRestController {
private AccountService accountService;
@Qualifier(dtoUtil)
private DtoUtil dtoUtil;
@GetMapping
public List<AccountDto> getAccounts() {
return accountService.findAll().stream()
.map(dtoUtil::mapToDto)
.collect(Collectors.toList());
}
运行测试会产生MockHttpServletResponse
,其正文为null
。
它对于我的正常(具有模型的非休息)控制器完美无缺,唯一的区别是它不使用DtoUtil
。
这可能是它不断返回null的原因吗?
编辑:
DtoUtil
:
@Component
public class DtoUtil{
@Autowired
private ModelMapper mapper;
public AccountDto mapToDto(Account account) {
return modelMapper.map(account, AccountDto.class);
}
}
答案 0 :(得分:1)
添加到您的测试中
when(dtoUtil.mapToDto(...)).thenCallRealMethod();