Fork me on GitHub
27 November 2017

在开发中,测试的重要性不言而喻。今天我们来看看,Spring MVC如何进行单元测试。

目录:

1. 依赖配置

<!--> maven 依赖 <-->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- spring mvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- spring boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
...
<build>
  <!--> 测试需要的资源文件 <-->
  <testResources>
    <testResource>
        <directory>src/test/resources</directory>
    </testResource>
  </testResources>
</build>

2. 编写测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring.xml"})
@WebAppConfiguration
public class SpringTest {

    @Resource
    private TestService testService;

    @Test
    public void testQuery() {
        Assert.assertNotNull(testService.query());
    }
}

如果想要一次运行多个测试类,可参考以下示例。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring.xml"})
@WebAppConfiguration
@SuiteClasses({SpringTest.class})
public class TestAll {

}

Spring Boot:

// junt 5, spring-boot-test 2.4
@SpringBootTest
@ExtendWith(SpringExtension.class)
// MockMvc
@AutoConfigureMockMvc
// web mvc
@AutoConfigureWebMvc
// JPA
@AutoConfigureDataJpa
@EnableJpaRepositories
@EntityScan

3. 常见问题

3.1 项目集成Swagger

如果使用springfox-swagger2,可能会抛出Error creating bean with name 'documentationPluginsBootstrapper'。原因是该项目使用WebApplicationContext,在测试类上加@WebAppConfiguration注解即可。

3.2 添加数据源

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="com.mysql.jdbc.Driver"
    p:url="jdbc:mysql://${ADDRESS}"
    p:username="${USER}"
    p:password="${PASSWD}" />

3.3 使用Hibernate Validator

若抛出缺少javax.el异常的话,添加如下依赖:

 <dependency>
     <groupId>org.glassfish</groupId>
     <artifactId>javax.el</artifactId>
     <version>${el-version}</version>
 </dependency>

3.4 Junit版本

Spring 4.3要求4.12以上版本的的Junit。

// 参考SpringJUnit4ClassRunner类
if (!ClassUtils.isPresent("org.junit.internal.Throwables", SpringJUnit4ClassRunner.class.getClassLoader())) {
  throw new IllegalStateException("SpringJUnit4ClassRunner requires JUnit 4.12 or higher.");
}

3.5 执行Maven打包时跳过测试

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>