繁体   English   中英

春季测试-每个项目的JavaConfig

[英]Spring Test - JavaConfig per Project

我的系统中有各种单元测试类,它们都扩展了一个名为AbstractContextTest的集中式测试类。 所述抽象超类通常如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
@ContextConfiguration(locations = {"/TestContext.xml"})
public class AbstractContextTest {
  // Various utility methods that would be useful in a unit test.
  ...
}

这里要注意的重要事情是@ContextConfiguration行。 它使用locations属性来加载存储在XML文件中的测试应用程序上下文。 它通过使用相对路径来工作,这使我可以执行以下操作:

  1. 我将AbstractContextTest超类放置在自己的项目中。
  2. 我将其他项目配置为将AbstractContextTest项目作为测试级别的依赖项。
  3. 我在每个项目的测试资源中都放置了一个名称相同的TestContext.xml
  4. 当我运行所有单元测试时,由于相对路径的缘故,每个项目都使用其本地的TestContext.xml
  5. 世间万事大吉。

现在是一个实际的问题:我希望从Spring XML Application Context的平静时期过渡到Spring JavaConfig的美好新世界。 在此范例中,是否有与我的相对路径解决方案等效的产品? 如果是这样,我如何将其拔出?

您可以在每个项目的src/test/java放置名称相同的@Configuration类,并获得相同的效果。 不过,在这一点上,您可能很聪明,我建议为每个项目都使用一个单独的中间抽象基础测试类。

@ContextConfiguration具有一个classes属性,该属性允许您指定Java配置文件而不是XML上下文。 但是,由于我们正在处理类,因此需要使用Java配置添加类,因此必须将其添加到导入中。 因此,您无法在测试项目中声明@ContextConfiguration(classes = TestConfig.class) ,因为没有具体的类它就无法编译(稍后您将在下游项目中创建不同的实现这一事实并不能帮助AbstractContextTest项目实现)。编译)。 这是一件好事,因为这意味着您必须在测试中明确说明您的Java配置。 毕竟,首先创建一个单独的项目是有原因的。

就个人而言,我更喜欢在相关测试中多添加两行带有特定于Spring的注释。 第一行清楚地表明这是一个基于Spring的测试(与一般的jUnit测试相对),第二行告诉我在哪里可以找到相关的应用程序上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class DownStreamProjectTest extends AbstractContextTest {

    // tests
}

旁注,我建议不要将DirtiesContextTestExecutionListener放在通用测试类层次结构中。 这将导致Spring为每个测试重新创建整个应用程序上下文,这将显着增加测试套件的周转时间。

对于任何曾经好奇的人,我将继续展示最终得出的正确解决方案。 我很确定这是chrylis所描述的内容,但是他很显然拒绝给出任何例子或以任何方式进行解释。

所以这是abstract超类本身:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(DependencyInjectionTestExecutionListener.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public abstract class AbstractContextTest {
  @Configuration
  @ComponentScan(basePackages = "my.package.name.test",
                 includeFilters = @Filter(type = FilterType.ANNOTATION,
                                          value = Configuration.class))
  static class ContextConfiguration {}
}

然后在其他项目中,在src/test/java ,在与abstract超类中的扫描包匹配的包(在本例中为“ my.package.name.test ”)中,您可以使用上下文类来命名喜欢。 在此示例中,我选择“ TestContext ”:

package my.package.name.test;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "package.under.test")
public class TestContext {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM