我正在开发一个Spring MVC项目,我对源代码树中的所有各种组件进行了单元测试.
例如,如果我有一个HomeController
需要LoginService
注入的控制器,那么在我的单元测试中,HomeControllerTest
我只是将对象实例化为正常(在Spring之外)并注入属性:
protected void setUp() throws Exception { super.setUp(); //... controller = new HomeController(); controller.setLoginService( new SimpleLoginService() ); //... }
这对于将每个组件作为一个独立的单元进行测试非常有用 - 除了我在项目中有几十个类,在编写一个类并为它编写成功的单元测试后,我一直忘记更新我的Spring MVC上下文文件部署的应用程序中的实际布线.我发现当我将项目部署到Tomcat并从非有线bean中找到一堆NullPointers时,我忘了更新上下文文件.
所以,这是我的问题:
这是我的第一个Spring项目 - 正如我所做的那样,为单个bean创建单元测试是正常的,然后创建第二套测试(集成测试)来测试一切是否与实际应用程序上下文一致?这是否有既定的最佳实践?
另外,如何将单元测试与集成测试分开?我有所有的源代码src
,单元测试test
- 应该有第二个测试文件夹(如test-integration
)用于集成测试用例?
由于这是我的第一个春季项目,我很好奇其他人通常会做这类事情 - 而不是重新发明轮子我宁愿问社区其他人.
我不能说是最佳实践,但这是我过去所做的.
单元测试:
为非平凡的bean(即大多数与Spring相关的bean)创建单元测试
在可行的情况下使用Mocks进行注入服务(即,大多数情况下,如果不是所有时间).
在项目test
目录中对这些测试使用标准命名约定.使用Test
或TestCase
作为类名的前缀或后缀似乎被广泛实践.
整合测试:
创建AbstractIntegrationTestCase
一个Spring
WebApplicationContext
用于在intetgration test clases中使用的.
在test
目录中使用命名约定进行集成测试.我已经使用IntTest
或IntegrationTest
作为这些测试的前缀或后缀.
设置三个Ant test
目标:
全部测试(或任何你想要命名的东西):运行单元和集成测试
测试:运行单元测试(仅因为test
似乎是单元测试的最常见用法)
测试集成:运行集成测试.
如上所述,您可以使用对项目有意义的命名约定.
至于将单元从集成测试分离到一个单独的目录中,只要开发人员及其工具可以轻松找到并执行它们,我认为这并不重要.
作为一个例子,我使用Spring工作的最后一个Java项目完全使用了上面描述的内容,集成测试和单元测试存在于同一test
目录中.另一方面,Grails项目明确地将通用测试目录下的单元和集成测试目录分开.
一些孤立的点:
是的,这是Spring测试的常用方法 - 单独的单元测试和集成测试,前者不加载任何Spring上下文.
对于您的单元测试,可以考虑进行模拟,以确保您的测试集中在一个隔离模块上.
如果你的测试是依赖大量的依赖,那么它们实际上不是单元测试.它们是集成测试,您可以使用new而不是依赖注入来连接依赖项.当您的生产应用程序使用Spring时浪费时间和重复工作!
用于调出Spring上下文的基本集成测试非常有用.
@required注释可以帮助您确保捕获Spring连接中所需的依赖项.
也许看看Maven会给你明确的阶段来绑定你的单元和集成测试.Maven在Spring社区中得到了广泛的应用.