单元测试与 Spring 集成测试

我正在处理一个Spring MVC项目,并且我对源代码树中的所有各种组件进行了单元测试。

例如,如果我有一个控制器,它需要注入其中,那么在我的单元测试中,我只是将对象实例化为正常对象(在Spring之外)并注入属性:HomeControllerLoginServiceHomeControllerTest

protected void setUp() throws Exception {
    super.setUp();
    //...
    controller = new HomeController();
    controller.setLoginService( new SimpleLoginService() );
    //...
}

这对于将每个组件作为一个独立的单元进行测试非常有用 - 除了现在我在项目中有几十个类,在编写了一个类并为其编写了成功的单元测试之后,我一直忘记更新我的Spring MVC上下文文件,该文件在部署的应用程序中进行实际连接。我发现当我将项目部署到Tomcat时,我忘记了更新上下文文件,并从非连接bean中找到一堆NullPointers。

所以,这是我的问题:

  1. 这是我的第一个Spring项目 - 像我所做的那样,为单个Bean创建单元测试,然后创建第二套测试(集成测试)来测试实际应用程序上下文中一切是否按预期工作?是否有既定的最佳实践?

  2. 此外,如何将单元测试与集成测试区分开来?我在 ,单元测试中拥有所有源代码 - 是否应该有第二个测试文件夹(如 )用于集成测试用例?srctesttest-integration

由于这是我的第一个春季项目,我很好奇其他人通常如何做这种事情 - 而不是重新发明轮子,我宁愿问社区的其他人。


答案 1

我不能说成为最佳实践,但这是我过去做过的事情。

单元测试:

  • 为非平凡的Bean(即,大多数与Spring相关的Bean)创建单元测试
  • 在可行的情况下(即,如果不是所有时间,大多数)使用Mocks注入服务。
  • 在项目目录中对这些测试使用标准命名约定。使用 或 作为类名的前缀或后缀似乎被广泛实践。testTestTestCase

集成测试:

  • 创建一个设置用于积分测试的 clas。AbstractIntegrationTestCaseSpringWebApplicationContext
  • 对目录中的集成测试使用命名约定。我已将 或 用作这些测试的前缀或后缀。testIntTestIntegrationTest

设置三个蚂蚁目标:test

  1. test-all(或任何你想命名它):运行单元和集成测试
  2. test:运行单元测试(只是因为似乎是单元测试最常见的用法test
  3. 测试集成:运行集成测试。

如前所述,您可以使用对项目有意义的命名约定。

至于将单元和集成测试分离到一个单独的目录中,我认为只要开发人员和他们的工具能够轻松找到并执行它们,这并不重要。

举个例子,我与Spring合作的最后一个Java项目完全使用了上面描述的内容,集成测试和单元测试位于同一目录中。另一方面,Grails项目在通用测试目录下显式分离单元和集成测试目录。test


答案 2

几个孤立的点:

是的,这是Spring测试的常用方法 - 单独的单元测试和集成测试,前者不加载任何Spring上下文。

对于单元测试,可以考虑模拟以确保测试集中在一个隔离的模块上。

如果你的测试连接了大量的依赖项,那么它们就不是真正的单元测试。它们是集成测试,您可以在其中使用新的而不是依赖关系注入来连接依赖项。当您的生产应用程序使用Spring时,浪费时间和重复工作!

基本的集成测试来调出您的Spring上下文是有用的。

@required注释可以帮助您确保在 Spring 布线中捕获所需的依赖项。

也许可以看看Maven,它将为您提供明确的阶段来绑定您的单元和集成测试。Maven在Spring社区中被广泛使用。


推荐