为什么在对控制器类进行单元测试时使用Spring Mockmvc

问题描述 投票:6回答:2

我看到我周围的人在控制器类的单元测试中使用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的功能而不是测试方法的实际代码?

附: :我已经将代码保持在最低限度,我认为这足以解释我的问题。假设没有编译错误。

java spring junit mockmvc
2个回答
7
投票

当谈到Controller(或任何暴露的端点)类的单元测试时,我们将验证两件事:

(1)控制器的实际逻辑本身是独立的,即调用或不调用正确的服务调用等。

(2)请求URL映射和响应状态和对象

上面的第(1)项是我们一般测试的所有其他类,如服务,实用程序类等。

对于已经暴露的端点(控制器类),需要另外覆盖/测试项目(2),因此无论我们使用Spring的MockMVC还是其他机器来做到这一点,它都取决于我们。

Spring的MockMVC确实帮助我们启动内存中的servlet容器并检查是否调用了正确的控制器方法,然后出现了正确的响应。

根据我的个人经验,测试控制器(第(2)项)帮助我解决URL映射冲突问题(当然,在同一个控制器内)等等。直接而不是在项目的后期修复它们。


1
投票

根据我的经验,我会尽力回答你的问题。

首先我们需要了解为什么我们使用单元测试?

这是开发人员用来编写干净的工作代码的额外检查。清洁工作代码意味着所写的每一行都应该按照预期的方式进行。你是如何实现这一目标的?这是单元测试。您编写的独立代码单元应单独验证。方法是代表独立单元代码模板的代码的最佳部分。

方法的单元测试

开发人员应该为描述方法行为的方法编写测试。我所遵循的可能检查是,考虑到所有积极情况,它会返回预期值吗?是否在Exception的情况下工作?它是否称为正确的后续方法?

开发人员应该通过实际调用它来提供模拟环境来验证方法

以下是您的问题的答案。虽然它完全基于开发人员。

控制器方法旨在调用正确的服务调用接受输入并将值从服务返回到视图。所以我可能会想到为控制器方法编写单元测试用例,因为您认为这是一种正确的方法。但是你应该通过调用方法来验证方法,就像实时调用它一样。所以你需要以与MVC相同的方式调用控制器方法。因此,使用MockMVC是更好的选择。 MockMVC还可用于验证作为控制器方法一部分的URL,输入参数,响应和状态。考虑到这些,它使它成为独立的代码单元。

希望这能澄清你的疑问。

© www.soinside.com 2019 - 2024. All rights reserved.