用于服务层的Spring MVC编写单元测试,该测试返回一个视图

时间:2019-06-21 12:31:51

标签: spring spring-mvc

我必须对服务层进行单元测试,但由于不熟悉SpringMvc,所以我不知道该怎么做。

这是我要测试的方法:

@Override
public String update(String username, User newUserData, BindingResult result, Model model) {
    if (result.hasErrors()) {
        updateModelData(model, "", result.getAllErrors());
        return HOME_VIEW_NAME;
    }

    User foundUser = this.userRepository.findByUsername(username);
    if (foundUser == null) {
        throw new UserNotFoundException(username);
    }

    String queryResult = String.format("UPDATED SUCCESSFULLY: \n Old User: %s", foundUser);
    foundUser.setPassword(encryptPassword(newUserData.getPassword()));
    foundUser.setStatus(newUserData.getStatus());
    queryResult += String.format("New User: %s", foundUser);

    this.userRepository.save(foundUser);

    updateModelData(model, queryResult, new ArrayList<>());
    return HOME_VIEW_NAME;
}

首先-我想知道保留ModelBindingResult并返回服务层中的页面是否是一个好主意?如果没有,为什么不呢?

第二-如何正确测试此方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为最好在控制器中返回页面。我相信Spring开发人员创建了这样的注释@Component@Repository@Service@Controller还将为特定组件所属的任何层提供上下文。您可以检查this discussion on SO regarding that

关于第二个问题,您可能想查看Spring MVC test framework。您可能想查看MockMvc,文档中以及Spring projects repository上都有大量引用。

如果要在更新后转到正确的 view 场景进行测试,您需要以下代码段:

MockMvc mockMvc;

mockMvc.perform(get("/path/to/update/resource"))
            .andExpect(status().isOk())
            .andExpect(modelAndView().getViewName().isEqualTo("your_view_name"));