【发布时间】:2017-03-31 10:18:40
【问题描述】:
我看到我周围的人在控制器类的单元测试中使用 Spring MVC,这对单元测试的用途没有帮助。
单元测试应该测试控制器类的实际实现,这可以通过简单的 Junit 测试而不是使用 Spring Mock MVC 更准确地实现。
但是问题来了,那么 Spring Mock MVC 的真正用途是什么?你需要它做什么?
假设我有以下代码:
@Controller
@RequestMapping("/systemusers")
public class SystemUserController
{
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getUser(final Model model)
{
// some logic to return user's details as json
return UserDetailsPage;
}
}
我可以用 Junit 比用 Spring Mock MVC 更准确地测试这个类/控制器(它所做的只是生成一些可以用 junit 断言的 json)。
我还可以使用 Spring Mock MVC 进行测试,例如使用正确的端点返回正确的 HTTP 状态和正确的响应页面字符串。
但这是否意味着我们正在测试 Spring MVC 的功能而不是被测方法的实际代码?
附: :我将代码保持在最低限度,我认为这足以解释我的问题。假设没有编译错误。
【问题讨论】:
-
使用 JUnit 编写的东西并不意味着它是一个单元测试,它很可能是一个集成测试,您可以在其中测试整个设置。
-
我看到的测试绝对不是集成测试
-
MockMvc 可以以两种不同的方式使用,独立的和完整的设置。独立模式基本上是设置控制器,然后像处理请求一样执行它。另一个好处是您还在控制器上测试您的映射,如果您只是调用该方法,您将不会对其进行测试。如果您希望发生某些事情(类型检查、自定义错误处理),这可能会非常方便。
-
接下来,如果你真的需要一个广泛的单元测试来测试你的控制器的功能,你可能在你的控制器中做的太多了,它基本上应该只是 web 和你的服务之间的集成组件层。它应该几乎不包含任何逻辑。