JUnit:我可以保留spring语境的公共部分吗?

时间:2012-01-25 16:11:20

标签: java spring junit

我在Spring上进行了一些单元测试。所有测试都加载一个spring配置文件,然后再添加一些。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:beans.xml" }, inheritLocations = true)
public abstract class TestBase {
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:extraBeansOne.xml" }, inheritLocations = true)
public class TestOne extends TestBase {

  @Test
  public void testA() {
  }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:extraBeansTwo.xml" }, inheritLocations = true)
public class TestTwo extends TestBase {

  @Test
  public void testB() {
  }
}

还有一个套件包含两个测试:

@RunWith(Suite.class)
@Suite.SuiteClasses({ TestOne.class, TestTwo.class })
public class TestSuite {
}

在common spring配置文件中,我有一个bean:

<beans ...>
  <bean id="testBean" class="com.example.TestBean" />
<bean>

问题在于,当我运行套件时, testBean 会被加载两次,每个测试类加载一次。由于它是在通用配置文件中定义的,有没有办法阻止它多次加载?

1 个答案:

答案 0 :(得分:1)

没有真正有机会重复使用它们。

Spring Junit Runner在不同的测试中重用spring上下文,但前提是文件是相同的。

  

9.3.2.1 Context management and caching   ...

     

测试类提供一个数组,其中包含XML配置元数据的资源位置 - 通常在类路径中 - 用于配置应用程序。这些位置与web.xml或其他部署配置文件中指定的配置位置列表相同或相似。

如果这对您非常重要并且您愿意花时间,那么您可以尝试实现基于应用程序上下文可以拥有父级的事实(就像Web应用程序中的两个上下文,一个已定义) for ContextLoaderListenerDispatcherServlet定义的另一个))然后可以在不同的测试方法dependend子上下文中使用/重用父上下文。

@See Spring Reference: Chapter 9.3.5.2 Context management and caching