我正在开发一个 Spring Boot Web API,我目前正在编写所需的单元测试。
我想知道:为控制器编写单元测试(JUnit + Mockito)还不够吗?由于控制器是我的应用程序的入口点,并且在服务端实现的所有逻辑都是从公开的 API 调用的,为什么我需要为服务端编写测试?
我正在开发一个 Spring Boot Web API,我目前正在编写所需的单元测试。
我想知道:为控制器编写单元测试(JUnit + Mockito)还不够吗?由于控制器是我的应用程序的入口点,并且在服务端实现的所有逻辑都是从公开的 API 调用的,为什么我需要为服务端编写测试?
首先,如果您编写测试以涵盖“所需的测试级别”或“完全进行一些测试”的要求,并且已经完成了生产实现,那么为时已晚。在大多数情况下,首先根据您的要求、合同、用例或任何更优化的方法进行测试。尽管如此,我不知道您的情况以及您要实施的事情,因此请将其视为建议并继续您要询问的关键问题。
您的 JUnit(最好是 5 个)和 Mockito 测试,可能使用MockMvc的是非常好的单元(类)测试来涵盖 Web 通信问题,例如:HTTP 请求类型、内容类型、编码、输入和输出参数 JSON(反)序列化、错误处理等。他们最好用模拟的服务层进行测试。多亏了这一点,您可以轻松涵盖大量网络案例,而无需在数据库等中准备数据。
还必须测试核心逻辑。根据它是什么,以单元方式对其进行测试可能是可行的(最容易编写,可以涵盖很多 - 也包括角落 - 案例)。可以用一些集成测试来补充它,以验证它在集成(Spring Beans、DB 等)中也能正常工作。
如果需要,您还可以通过控制器通过(真实)HTTP 请求从 Web 调用编写一些 E2E 测试,向数据库/数据存储(如果有)提供服务,但我会将其限制在最重要的场景中,以便在您的CI/CD 管道以验证部署是否成功完成。
免责声明。我发现这种方法在多种情况下都很有用,但在其他一些情况下,改变平衡点以更好地应用测试可能会很好。
我认为您可能对单元测试和集成测试感到困惑。
如果您使用的是 Mockito,您可能指的是单元测试,其中测试类的范围应该只是当前类。
应该模拟任何外部方法调用。因此,在您为控制器类编写单元测试的情况下,应该模拟服务调用。
您的测试套件应包含