使用Spring的Mock MVC

Abu*_*kar 7 java junit spring mockmvc

我看到我周围的人在控制器类的单元测试中使用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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我可以使用Junit比使用Spring Mock MVC更准确地测试这个类/控制器(它所做的只是生成一些可以用junit声明的json).

我也可以使用Spring Mock MVC测试,就像使用正确的端点返回正确的HTTP状态和正确的响应页面字符串一样.

但这是不是意味着我们正在测试Spring MVC的功能而不是测试方法的实际代码?

PS:我把代码保持在最低限度,我认为足以解释我的问题.假设没有编译错误.

dev*_*per 9

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

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

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

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

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

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

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

  • 此外,还可以使用@Valid注释和相应的返回码来测试参数验证的可能性,或者可以检查@ExceptionHandler的工作是否可行。 (2认同)