【问题标题】:Spring MVC write unit test for service layer which returns a viewSpring MVC 为返回视图的服务层编写单元测试
【发布时间】:2019-06-21 12:31:51
【问题描述】:

我必须对我的服务层进行单元测试,但我不知道该怎么做,因为我是 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 并在服务层返回一个页面是否是个好主意?如果没有,为什么不呢?

第二 - 我应该如何正确测试这个方法?

谢谢!

【问题讨论】:

  • 首先不,因为这些应该保留在您的控制器中,并且您的服务应该只包含更新/保存用户的代码。模拟单元测试第二名。
  • 谢谢!我将重构此代码以将逻辑与 UI 处理解耦

标签: spring spring-mvc


【解决方案1】:

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

关于第二个问题,您可能需要查看Spring MVC test framework。您可能想查看MockMvc,文档和Spring projects repository 中有大量参考资料。

如果你想测试你的场景,在更新后它进入正确的视图,我认为你需要类似下面的sn-p:

MockMvc mockMvc;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2014-07-14
    • 2020-02-10
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多