【问题标题】:MockMvc REST controller - always returns empty bodyMockMvc REST 控制器 - 始终返回空主体
【发布时间】:2018-06-02 16:16:35
【问题描述】:

我想使用 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);
    }
}

【问题讨论】:

    标签: java spring unit-testing spring-mvc mockmvc


    【解决方案1】:

    添加到您的测试中

    when(dtoUtil.mapToDto(...)).thenCallRealMethod(); 
    

    【讨论】:

    • 谢谢!不过,我将如何注入DtoUtil 中使用的ModelMapper?作为当前单元测试中的一个 mockedBean,modelMapper 为空。还是我应该只生成一个新的 AccountDTO 并返回它?
    • @Martens 您没有为 DtoUtil 粘贴任何代码,但最简单的方法是手动创建 DtoUtil 对象及其所有依赖项(new ...),然后调用此对象的 mapToDto () 方法如when(dtoUtil.mapToDto(...)).thenAnswer(call previously created DtoUtil.mapToDto() )
    • 我添加了 DtoUtil 类,创建它仍然是最好的方法吗?
    • 就我个人而言,我会像嘲笑 accountService.findAll() 一样嘲笑 DtoUtil.mapToDto()。这将允许您仅测试控制器方法中的代码,避免 DtoUtil.mapToDto() 中的错误导致您的控制器测试失败(当然您必须为您的 DtoUtil 进行另一组测试)。
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-03-07
    相关资源
    最近更新 更多