Java SpringBootREST应用程序测试方法

Java SpringBootREST应用程序测试方法,java,spring,rest,junit,spring-boot,Java,Spring,Rest,Junit,Spring Boot,我有一个Spring boot+REST应用程序。当我需要编写单元测试时,我应该直接调用服务bean还是调用rest控制器?如果我直接调用rest控制器,我必须使用RestTemplate并作为客户机调用RESTAPI,对吗 最佳和必要的做法是什么 如果我直接调用服务bean,它将导致更少的代码覆盖率,因为控制器方法代码将不被覆盖。这可以接受吗?最好的方法是通过控制器进行测试。在此处输入Web服务并返回值。因此,控制器在这方面发挥了相当好的作用。也可能有一些小的逻辑,你可能会错过 您可以尝试使用

我有一个Spring boot+REST应用程序。当我需要编写单元测试时,我应该直接调用服务bean还是调用rest控制器?如果我直接调用rest控制器,我必须使用RestTemplate并作为客户机调用RESTAPI,对吗

最佳和必要的做法是什么


如果我直接调用服务bean,它将导致更少的代码覆盖率,因为控制器方法代码将不被覆盖。这可以接受吗?

最好的方法是通过控制器进行测试。在此处输入Web服务并返回值。因此,控制器在这方面发挥了相当好的作用。也可能有一些小的逻辑,你可能会错过

您可以尝试使用该方法测试控制器

参考文献:


或者使用您在问题

中提到的RestTemplate,嗯,这是一个复杂的问题,但我会尽我所能回答。这在很大程度上取决于您/您的组织的风险承受能力以及他们希望在测试中投入多少时间。我相信很多测试,但也有太多的东西

单元测试测试代码的单元。很好,但什么是单位?这篇文章是一个很好的讨论:但是单元基本上是应用程序中最小的可测试部分

许多文献(例如)描述了测试的多个阶段,包括非常低级别的模拟外部性(如DBs或文件系统或远程系统)的单元测试,以及“api验收测试”(有时称为集成测试,尽管这是一个模糊的术语,可能意味着其他事情)。后一种类型启动应用程序的测试实例,调用API并对响应进行断言


简短的回答如下:对于单元测试,关注单元(可能是服务或更细粒度的),但是您描述的另一组测试,其中测试的行为类似于客户端并调用您的api,也是值得的。我的建议是:两者都做,但不要同时调用两个单元测试。

这是基于您想要测试的内容,您可以将您的测试分开,特别是如果您有一个开发团队,请制作测试用例来测试您的业务“服务”,并制作另一个测试用例作为集成测试来使用REST模板,在这种情况下,您可以更快、更容易地发现bug。

这取决于您想做什么

一种方法是单元测试工作单元,如服务和MVC控制器。这些测试只测试此类中的最终逻辑,并尝试达到较高的分支覆盖率(如果适用)。 除此之外,您还可以编写一个集成测试来发出HTTP请求,转到真正的服务bean,并且只模拟最终的资源访问


对于集成测试,您可以使用Spring的支持,请参见此处:

我认为,如果您进行集成测试,它也包括单元测试。因此,无需再次编写单元测试用例,这也是可以理解的。单元测试通常作为TDD的一部分创建,因此它们的用途略有不同。它们驱动设计,确保划分和单一责任,并揭示编写代码的开发人员的意图,以及开发人员使用他们构建的单元的设想。API级别的验收测试更能确保您满足(而不是倒退到预先存在的)验收标准。