我有一个Spring启动+ REST应用程序。当我需要编写单元测试时,我应该直接调用服务bean还是调用其余的控制器?如果我直接调用其余的控制器,我必须使用RestTemplate并调用其余的api作为客户端,对吗?
最佳和必需的练习是什么?
如果我直接调用服务bean,它将导致更少的代码覆盖率,因为控制器方法代码将不会被覆盖。那可以接受吗?
答案 0 :(得分:2)
单元测试测试代码单元。很棒,但是什么是单位?本文是一个非常好的讨论:http://martinfowler.com/bliki/UnitTest.html但是一个单元基本上是应用程序中最小的可测试部分。
许多文献(例如https://www.amazon.ca/Continuous-Delivery-Reliable-Deployment-Automation/dp/0321601912/)描述了多个测试阶段,包括非常低级别的单元测试和模拟外部性,例如DB或文件系统或远程系统,以及" api验收测试" (有时称为集成测试,虽然这是一个模糊的术语,可能意味着其他事情)。后一种类型会激活应用程序的测试实例,在响应时调用API和断言。
简短的回答如下:对于单元测试,关注单元(可能是服务或更细粒度),但是你描述的另一组测试,其中测试表现得像客户端并调用你的api,也是值得的。我的建议是:做两件事,但不要同时进行单元测试。
答案 1 :(得分:1)
最佳方法是测试VIA控制器。输入Web服务并在此处返回值。因此,控制器在这方面发挥了相当大的作用。也可能有小逻辑,你可能会错过
您可以尝试使用MockMvc方法测试控制器。
或者使用问题Reference-3
中提到的RestTemplate答案 2 :(得分:0)
它基于您想要测试的内容,您可以分离您的测试,特别是如果您有开发人员团队,测试用例来测试您的业务"服务"以及另一个测试用例作为集成测试要使用REST模板,在这种情况下,您可以更快,更轻松地计算您的错误。
答案 3 :(得分:0)
这取决于你想做什么。
一种方法是对工作单元进行单元测试,例如服务和MVC控制器。这些测试仅测试此类中的最终逻辑,并尝试达到高分支覆盖(如果适用)。 除此之外,您还可以编写一个集成测试来发出HTTP请求,转到真正的服务bean,并且只模拟最终的资源访问。
对于集成测试,您可以使用Spring的支持,请参阅此处:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#spring-mvc-test-framework