为什么在对控制器 类 进行单元测试时使用 Spring 的 Mockmvc
Why use Spring's Mock MVC when you have unit tets of your controller classes
我看到我周围的人在控制器 classes 的单元测试中使用 Spring MVC,这对单元测试的用途没有帮助。
单元测试应该测试控制器的实际实现 class,这可以通过简单的 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 更准确地测试这个 class/controller(它所做的只是生成一些可以用 junit 断言的 json)。
我还可以使用 Spring Mock MVC 进行测试,例如使用正确的端点 returns 正确的 HTTP 状态和正确的响应页面字符串。
但这是否意味着我们正在测试 Spring MVC 的功能而不是被测方法的实际代码?
P.S。 :我将代码保持在最低限度,我认为这足以解释我的问题。假设没有编译错误。
当涉及到 Controller
(或任何公开的端点)类 的单元测试时,我们将验证两件事:
(1) 控制器的实际逻辑本身是独立的,即是否调用正确的服务调用等。
(2) 请求 URL 映射和响应状态和对象
上面的第 (1) 项是我们对所有其他 类(如服务、实用程序 类 等)进行的一般测试。
第(2)项需要covered/tested对于已经暴露的端点(controller类),所以我们是否使用Spring 的 MockMVC
或其他机器来做到这一点,这完全取决于我们。
Spring 的 MockMVC
确实帮助我们启动内存中的 servlet 容器 & 检查是否调用了正确的控制器方法 & 然后正确的答案已经出来了。
根据我个人的经验,测试控制器(针对项目 (2))帮助我解决了 URL 映射冲突问题(当然,在同一个控制器内)等等。直接而不是修复它们在项目的后期阶段。
根据我的经验,我会尽量回答你的问题。
首先我们需要了解为什么要使用单元测试?
It is a extra check used by developer to write clean working code.
Clean working code means every line written should be doing what it is
expected to do. how do you achieve this? Here comes unit testing. The
standalone unit of code you are writing should be verified standalone.
Method is best part in code which represents standalone unit code
template.
方法单元测试
Developer should write a test for method which describes the method
behavior. And possible checks that i follow is is it returning the
expected value considering all positive scenarios? is it working in
case of Exception? is it calling correct subsequent methods ?
Developer should verify the method by actually calling it providing a
mock environment
以下是您问题的可能答案。尽管它完全基于开发人员。
控制器方法旨在调用正确的服务调用,接受输入并将值从服务返回到视图。
因此,我可能会考虑为控制器方法编写一个单元测试用例,因为您认为这是一种正确的方法。但是您应该通过调用它来验证该方法,因为它会被实时调用。
所以你需要以与 MVC 相同的方式调用控制器方法。因此,使用 MockMVC 是更好的选择。
MockMVC 对于验证作为控制器方法一部分的 urls、输入参数、响应和状态也很有用。考虑到所有这些,它使其成为独立的代码单元。
希望这能澄清您的疑问。
我看到我周围的人在控制器 classes 的单元测试中使用 Spring MVC,这对单元测试的用途没有帮助。
单元测试应该测试控制器的实际实现 class,这可以通过简单的 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 更准确地测试这个 class/controller(它所做的只是生成一些可以用 junit 断言的 json)。
我还可以使用 Spring Mock MVC 进行测试,例如使用正确的端点 returns 正确的 HTTP 状态和正确的响应页面字符串。
但这是否意味着我们正在测试 Spring MVC 的功能而不是被测方法的实际代码?
P.S。 :我将代码保持在最低限度,我认为这足以解释我的问题。假设没有编译错误。
当涉及到 Controller
(或任何公开的端点)类 的单元测试时,我们将验证两件事:
(1) 控制器的实际逻辑本身是独立的,即是否调用正确的服务调用等。
(2) 请求 URL 映射和响应状态和对象
上面的第 (1) 项是我们对所有其他 类(如服务、实用程序 类 等)进行的一般测试。
第(2)项需要covered/tested对于已经暴露的端点(controller类),所以我们是否使用Spring 的 MockMVC
或其他机器来做到这一点,这完全取决于我们。
Spring 的 MockMVC
确实帮助我们启动内存中的 servlet 容器 & 检查是否调用了正确的控制器方法 & 然后正确的答案已经出来了。
根据我个人的经验,测试控制器(针对项目 (2))帮助我解决了 URL 映射冲突问题(当然,在同一个控制器内)等等。直接而不是修复它们在项目的后期阶段。
根据我的经验,我会尽量回答你的问题。
首先我们需要了解为什么要使用单元测试?
It is a extra check used by developer to write clean working code. Clean working code means every line written should be doing what it is expected to do. how do you achieve this? Here comes unit testing. The standalone unit of code you are writing should be verified standalone. Method is best part in code which represents standalone unit code template.
方法单元测试
Developer should write a test for method which describes the method behavior. And possible checks that i follow is is it returning the expected value considering all positive scenarios? is it working in case of Exception? is it calling correct subsequent methods ?
Developer should verify the method by actually calling it providing a mock environment
以下是您问题的可能答案。尽管它完全基于开发人员。
控制器方法旨在调用正确的服务调用,接受输入并将值从服务返回到视图。 因此,我可能会考虑为控制器方法编写一个单元测试用例,因为您认为这是一种正确的方法。但是您应该通过调用它来验证该方法,因为它会被实时调用。 所以你需要以与 MVC 相同的方式调用控制器方法。因此,使用 MockMVC 是更好的选择。 MockMVC 对于验证作为控制器方法一部分的 urls、输入参数、响应和状态也很有用。考虑到所有这些,它使其成为独立的代码单元。
希望这能澄清您的疑问。