我正在开发一个Spring Boot Web API,目前正在编写所需的单元测试。
我想知道:为控制器编写单元测试(JUnit + Mockito)还不够吗?既然控制器是我的应用程序的入口点,并且在服务端实现的所有逻辑都是从公开的API调用的,那么为什么我需要为服务端编写测试呢?
发布于 2020-04-25 04:00:49
首先,如果您编写的测试涵盖了已经完成生产实现的“所需的测试级别”或“有一些测试”的需求,那么就有点晚了。在大多数情况下,首先进行测试,基于您的需求,合同,用例或任何它更优化的方法。尽管如此,我不知道你的情况和你试图实现的事情,所以把它当作一个建议,然后继续你所询问的关键事情。
您的JUnit (最好是5)和Mockito测试(可能使用MockMvc )是非常好的单元(-like)测试,可以涵盖web通信问题,例如: HTTP请求类型、内容类型、编码、输入和输出参数JSON (反)序列化、错误处理等。它们最好使用模拟的服务层进行测试。多亏了这一点,你可以轻松地涵盖许多web案例,而不需要在数据库中准备数据,等等。
核心逻辑也必须进行测试。取决于它是什么,以单元方式测试它可能是可行的(最容易编写,可以涵盖许多-也包括角落-案例)。可以用一些集成测试来补充它,以验证它在集成(Spring Bean、DB等)中也工作得很好。
如果需要,您还可以从web调用编写一些E2E测试,通过控制器、服务到数据库/数据存储(如果有)的(真正的) HTTP请求,但我会将其限制在最重要的场景中,以便在CI/CD管道中使用它来验证部署是否成功完成。
免责声明。我发现这种方法在多种情况下都很有用,但在其他一些情况下,改变平衡点以更好地应用测试可能是很好的。
发布于 2020-04-25 14:31:01
我想你可能把单元测试和集成测试搞混了。
如果你使用的是Mockito,你可能指的是单元测试,其中Test class的作用域应该只是当前类。
任何外部方法调用都应该是mocked.So的,在您的情况下,服务调用应该是模拟的,以便为您的控制器类编写单元测试。
你的测试套件应该包含
控制器测试的
https://stackoverflow.com/questions/61413347
复制相似问题