Spring boot springbootapi的单元测试

Spring boot springbootapi的单元测试,spring-boot,junit,mockito,spring-boot-test,Spring Boot,Junit,Mockito,Spring Boot Test,我正在开发一个SpringBootWebAPI,目前正在编写所需的单元测试 我想知道:为控制器编写单元测试(JUnit+Mockito)是否足够?由于控制器是我的应用程序的入口点,并且服务端中实现的所有逻辑都是从公开的API调用的,为什么我需要为服务端编写测试?首先,如果您编写测试以涵盖“所需的测试级别”或“有一些测试”的要求既然已经完成了生产实现,就有点太晚了。在大多数情况下,根据您的需求、合同、用例或任何更为优化的方法,首先进行测试。尽管如此,我不知道你的情况和你正试图实施的事情,所以把它当

我正在开发一个SpringBootWebAPI,目前正在编写所需的单元测试


我想知道:为控制器编写单元测试(JUnit+Mockito)是否足够?由于控制器是我的应用程序的入口点,并且服务端中实现的所有逻辑都是从公开的API调用的,为什么我需要为服务端编写测试?

首先,如果您编写测试以涵盖“所需的测试级别”或“有一些测试”的要求既然已经完成了生产实现,就有点太晚了。在大多数情况下,根据您的需求、合同、用例或任何更为优化的方法,首先进行测试。尽管如此,我不知道你的情况和你正试图实施的事情,所以把它当作一个建议,继续讨论你正在询问的关键问题

JUnit(最好是5)和Mockito测试,它们可能使用
MockMvc
是非常好的单元(-like)测试,可以涵盖web通信方面的问题,例如:HTTP请求类型、内容类型、编码、输入和输出参数JSON(反)序列化、错误处理等。最好在模拟服务层的情况下进行测试。正因为如此,您可以轻松地覆盖大量web案例,而无需准备数据库中的数据等

核心逻辑也必须进行测试。根据它是什么,以单元的方式测试它可能是可行的(最容易编写,可以覆盖很多情况,也包括一些特殊情况)。可以用一组集成测试来补充它,以验证它在集成(SpringBeans、DB等)中也能正常工作

如果需要,您也可以通过控制器、服务到数据库/数据存储(如果有)的(真实)HTTP请求从web调用编写一些E2E测试,但我将仅限于在CI/CD管道中使用它来验证部署是否成功完成的最重要场景


免责声明。我发现这种方法在多种情况下都很有用,但在某些其他情况下,最好改变平衡点,以便更好地应用测试。

我认为您可能会混淆单元测试和集成测试

如果您使用的是Mockito,那么您可能指的是单元测试,其中,测试类的作用域应该仅为当前类

任何外部方法调用都应该被模拟。因此,在您的情况下,服务调用应该被模拟,以防您为控制器类编写单元测试

您的测试套件应该包含

  • Junit for Controller——测试接口契约点,如HTTP方法、请求参数、强制输入、有效请求有效负载
  • Junit适用于所有其他类,包括服务类——这是为了测试应用程序类的核心逻辑
  • 集成测试最后一个集成测试,它可以使用服务类和其他应用程序代码功能攻击控制器端点

您应该为您的服务编写JUnit测试用例,因为它们可以确保您的服务逻辑按预期工作。此外,如果一个人在几年后查看了您的代码,并且他/她试图向现有功能添加一些代码,那么服务测试将失败,他/她将知道他们的更改正在破坏部分业务逻辑。他们必须相应地更改测试,以确保一切正常。@nrai您建议我只为服务层编写单元测试,而不是为控制器编写单元测试?我建议您为应用程序中的控制器和服务编写JUnit测试。为控制器编写代码也是必要的,因为它们就像一个入口点,通过测试确保端点与控制器中定义的端点完全一致是有意义的。如果您有这些测试,没有人可以篡改/破坏代码。