[英]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文件中的测试应用程序上下文。 它通过使用相对路径来工作,这使我可以执行以下操作:
AbstractContextTest
超类放置在自己的项目中。 AbstractContextTest
项目作为测试级别的依赖项。 TestContext.xml
。 TestContext.xml
。 现在是一个实际的问题:我希望从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.