在Spring MVC中对控制器类进行单元测试是一种好习惯

米卡伊尔·阿卜杜勒拉耶夫(Mikayil Abdullayev):

我曾经像其他任何普通的Java类一样对控制器类进行单元测试。我的意思是不使用Spring的MockMvc。但是后来我意识到,这种方式将无法确保我正确设置了MVC配置。所以,如果我有这样的控制器:

@Restcontroller
@RequestMapping("/cars")
public class CarController{
    private CarService carService;
    public CarController (CarService service){this.carService = service};
    @GetMapping
    public List<Car> getCar(@RequestParam("filter") String filter){
       if(filter!=null && !filter.trim().equal("")){
          //omitted for brevity
       }
    }
}

如果我getCar直接对它的方法进行单元测试,即使测试通过了,那也并不意味着我的控制器就可以了。因此,我开始进行集成测试,而不是进行单元测试。像这样:

mockMvc.perform(get("/v1/cars?filter = Honda"))....  bla bla bla

最近出现了一个问题,我们是否应该首先进行单元测试和集成测试休息控制器。乍一看,在我看来,集成测试最终会检查控制器的正确行为。但是另一方面,仅依赖集成测试有多好。

Ph03n1x:

我个人从来没有发现单元测试控制器有用。在理想情况下,控制器相对较小,因为它仅调用服务对象的几种方法并返回结果。IMO单元测试将意味着(过度)使用该verify()方法。(即,控制器是否使用正确的参数调用了service方法。)

例如,在我的案例中,编写良好的控制器方法如下所示:

@LoggingInfo
  @PostMapping(value = "/someRoute",
      produces = "application/json",
      consumes = "application/json")
  @ApiOperation(value = "Some description", response = SomeDTO.class)
  public @ResponseBody
  CompletableFuture<ResponseEntity> someControllerMethod(
      @Validated(ValidationSequence.class) @RequestBody SomeDTO someDTO) {

    return service
        .doSomething(someDTO)
        .thenApply((String var) -> ResponseEntity.ok(ResponseDTO.builder()
            .myField(Collections.singleton(var)).build()));
  }

对这种方法进行单元测试将在多大程度上为应用程序增加价值?

对我而言,改变游戏规则的是集成测试的使用。此处显示所有弹簧魔术是否正常工作,例如:

  • 注释触发的验证器
  • (不同的)验证器顺序
  • 转换器(即看到杰克逊在行动)
  • 异常处理程序(是带注释的异常处理程序实际捕获的引发的异常)

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Security在REST控制器上进行单元测试时引起问题

Spring REST控制器在单元测试中的行为有所不同

在实现Spring控制器的单元测试时缺少hasSize()和hasProperty()依赖项

如何使用@PathVariable对Spring MVC控制器进行单元测试?

在Spring中将事务服务注入到另一个事务服务中是一种好习惯吗?

如何对Spring MVC带注释的控制器进行单元测试?

对异步代码进行单元测试是一种好习惯吗?

Spring MVC:如何通过返回String的控制器方法对模型的属性进行单元测试?

带有整数值@RequestParam的spring mvc控制器的单元测试

在AngularJS中结合使用CREATE和EDIT控制器是一种好习惯吗?

当结果Object / json包含Long字段类型时,对Spring MVC REST控制器进行单元测试

在Laravel中从另一个控制器调用控制器是一种好习惯吗?

在单元测试中模拟Automapper是一种好习惯吗?

Spring MVC控制器单元测试:如何设置私有实例布尔字段?

在服务器端(控制器)进行验证是一种好习惯吗?ASP.NET MVC

使用Spring Boot,Kotlin和Junit进行休息控制器单元测试

如何在Spring Boot中编写控制器的单元测试

将类扩展提取到单独的头文件中以便在Objective-C中进行单元测试是否是一种好习惯?

使用spring-test-mvc进行的弹簧控制器单元测试失败

Spring MVC中的单元测试

返回PagedResources的单元测试Spring MVC控制器

在 Spring 控制器上执行单元测试

将 Spring 中的 @Autowired 字段设置为私有是一种好习惯吗?

Spring Boot 控制器单元测试:无法加载 ApplicationContext

Spring Boot 单元测试未获取模拟控制器的请求映射

如何为我的 Spring Boot 控制器执行单元测试?

Spring Boot - 控制器上的单元测试 - 404 答案

如何使用 spring boot 和 mockito 对控制器方法进行单元测试

Spring MVC 控制器测试 PUT