如何防止在单元测试期间反复加载spring应用程序上下文

时间:2013-08-05 14:12:47

标签: spring maven junit

我有一个基于Spring的Java EE Web应用程序。我正在测试我的“存储库”,它只是使用junit的数据访问对象(DAO)。我使用maven来构建和测试我的项目。我所拥有的单元测试的一个例子如下所示:

@ContextConfiguration(locations = {"classpath:spring/business-objects.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class JpaUserRepositoryTests {
 @AutoWired
 UserRepository userRepository;

 @Test
 @Transactional
 public void testCreate() {
  boolean result = userRepository.create(new User("name","pass"));
  Assert.assertTrue(result);
 }
}

我的maven-surefire-plugin配置如下所示。

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.13</version>
 <configuration>
  <includes>
   <include>**/*Tests.java</include>
  </includes>
 </configuration>
</plugin>

我的问题是我有多个存储库测试,每次运行“mvn clean test”时,对于每个存储库测试类,一遍又一遍地加载spring应用程序上下文。有没有办法配置我的测试,以便Spring应用程序上下文只加载一次我的所有存储库测试?

2 个答案:

答案 0 :(得分:1)

是的,设置选项 forkMode =一次(目前,版本2.15,此选项已默认为&#34;一次&#34;。我不知道,因为这是但我知道在早期版本中它总是&#34;。

答案 1 :(得分:1)

奇怪的是,spring有一个用于缓存上下文进行测试的单例,只要你使用相同的上下文配置,spring就会重用上下文(see docs

我能想象的唯一两个选项是,你使用的是没有这个功能的旧版弹簧(我不确定这个功能何时推出,但我认为有时会在2.5版本左右。 x)的

另一种选择是你的项目继承自maven pom,它配置surefire以使用forkMode=always,这将为每个测试类产生一个新的jvm。

我不知道哪种情况会导致这种情况......我希望上述情况有所帮助。