SpringJUnit4ClassRunner - 即使使用相同的上下文,也为每个测试重新加载Context

时间:2015-03-23 00:38:59

标签: unit-testing spring-mvc spring-junit springjunit4classrunner

这是我们单元测试的基类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring/test-context.xml")
public abstract class BaseUnitTest {}

所有单元测试都扩展了这个类。

当我在eclipse中本地运行测试时(使用Run As> Unit Test),测试在大约5秒内运行,因为所有测试共享相同的上下文并且只加载一次。

但是,当我使用mvn测试目标运行它时,大约需要5分钟。查看日志后,我看到正在为每个测试加载应用程序上下文。 我们在Jenkins CI服务器上运行它需要相同的时间(5分钟)。

不确定发生了什么。在spring docs中,它声明即使使用maven也应该重用appContext,但事实并非如此。

任何帮助都将不胜感激。

更新: 我运行带有调试标志的mvn,我发现每个测试都会生成一个新的JVM:

分叉命令行:cmd.exe / X / C“java -Xverify:none -jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefirebooter8169952914558366417.jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire8550033206398936560tmp S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire_05655453605766528120tmp“

分叉命令行:cmd.exe / X / C“java -Xverify:none -jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefirebooter4002024477779069323.jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire6735432532690834115tmp S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire_17783676008756503456tmp“

分叉命令行:cmd.exe / X / C“java -Xverify:none -jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ 7874269889863176184.jar S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire2050758518148174678tmp S:\ git \ picaxo21 \ picaxo \ picaxoService \ target \ surefire \ surefire_27591156970671336255tmp“

我使用forkCount = 1和reuseForks = true所以我不确定为什么会这样。任何线索?

父POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    .....
</parent>

<groupId>...</groupId>
<artifactId>picaxo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>.....</name>
<description>Build All Modules</description>

<modules>
    <module>picaxoService</module>
</modules>

<scm>
    ....
</scm>

<properties>
    <pmd.include.tests>true</pmd.include.tests>
    <findbugs.plugin.version>3.0.0</findbugs.plugin.version>
    <fb.threshold>Low</fb.threshold>
    <fb.includeTests>true</fb.includeTests>
    <fb.effort>Max</fb.effort>
    <fb.failOnError>false</fb.failOnError>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <skipTests>true</skipTests>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>
                <skipTests>${skipTests}</skipTests>
                <reuseForks>true</reuseForks>
                <forkCount>1</forkCount>
                <excludes>
                    <exclude>**/*IntegrationTest.java</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <phase>integration-test</phase>
                    <configuration>
                        <excludes>
                            <exclude>none</exclude>
                        </excludes>
                        <includes>
                            <include>**/*IntegrationTest.java</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</build>

1 个答案:

答案 0 :(得分:0)

发现问题。 显然,用于surefire插件的forkMode默认为pertest因此为每个测试产生了一个新的JVM。在插件配置中明确地将其设置为一次解决了该问题。