传统上,为Spring MVC控制器编写单元测试既简单又成问题。 尽管编写调用控制器方法的单元测试非常简单,但问题是这些单元测试不够全面。 例如,我们不能仅通过调用已测试的控制器方法来测试控制器映射,验证和异常处理。
Spring MVC Test通过使我们能够通过DispatcherServlet调用控制器方法来解决了这个问题。 这是本教程的第一部分,描述了Spring MVC控制器的单元测试,并描述了如何配置单元测试。 让我们开始吧。
使用Maven获取所需的依赖关系
我们可以通过在pom.xml文件中声明以下测试依赖项来获取所需的依赖项:
- JUnit 4.11
- Mockito Core 1.9.5
- Spring测试3.2.3发布
pom.xml文件的相关部分如下所示:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.3.RELEASE</version>
<scope>test</scope>
</dependency>
让我们继续前进,快速看一下示例应用程序。
我们的示例应用程序剖析
本教程的示例应用程序为待办事项提供CRUD操作。 为了了解测试类的配置,我们必须对测试的控制器类有一些了解。
在这一点上,我们需要知道以下问题的答案:
- 它有什么依赖性?
- 如何实例化?
通过查看TodoController类的源代码,我们可以获得这些问题的答案。 TodoController类的相关部分如下所示:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
@Controller
public class TodoController {
private final TodoService service;
private final MessageSource messageSource;
@Autowired
public TodoController(MessageSource messageSource, TodoService service) {
this.messageSource = messageSource;
this.service = service;
}
//Other methods are omitted.
}
如我们所见,控制器类具有两个依赖项: TodoService和MessageSource 。 另外,我们可以看到我们的控制器类使用构造函数注入。
至此,这就是我们需要的所有信息。 接下来,我们将讨论我们的应用程序上下文配置。
配置应用程序上下文
为我们的应用程序和测试维护单独的应用程序上下文配置很麻烦。 同样,如果我们在应用程序的应用程序上下文配置中进行了某些更改,但是忘记对测试上下文进行相同的更改,则会导致问题。
这就是为什么对示例应用程序的应用程序上下文配置进行划分的原因,我们可以在测试中重用部分应用程序。
我们的应用程序上下文配置划分如下:
- 第一个应用程序配置类称为ExampleApplicationContext ,它是我们应用程序的“主要”配置类。
- 第二个配置类负责配置应用程序的Web层。 此类的名称是WebAppContext ,它是我们在测试中将使用的配置类。
- 第三个配置类称为PersistenceContext ,它包含应用程序的持久性配置。
注意:示例应用程序还具有使用XML配置文件的有效应用程序上下文配置。 与Java配置类相对应的XML配置文件为: exampleApplicationContext.xml ,exampleApplicationContext-web.xml和exampleApplicationContext-persistence.xml 。
让我们看一下Web层的应用程序上下文配置,并了解如何配置测试上下文。
配置Web层
Web层的应用程序上下文配置具有以下职责:
- 它启用了注释驱动的Spring MVC。
- 它配置静态资源(例如CSS文件和Javascript文件)的位置。
- 它确保静态资源由容器的默认Servlet提供。
- 它确保在组件扫描期间找到控制器类。
- 它配置ExceptionResolver bean。
- 它配置ViewResolver bean。
让我们继续看一下Java配置类和XML配置文件。
Java配置
如果使用Java配置,则WebAppContext类的源代码如下所示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annot