从元注释覆盖ContextHierarchy和ContextConfiguration

时间:2014-07-31 17:58:33

标签: java spring spring-test spring-test-mvc

我们使用元注释测试类:

@WebAppConfiguration
@ContextHierarchy({
    @ContextConfiguration(locations = {"/web/WEB-INF/spring.xml" }, name = "parent"),
    @ContextConfiguration("/web/WEB-INF/spring-servlet.xml")
})
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BaseSpringTest {
}

但是希望能够从测试类本身覆盖或附加到层次结构的元素,例如:

@BaseSpringTest
@ContextConfiguration(locations = {"/web/WEB-INF/spring-extension.xml" }, name = "parent")
public class MyTest extends AbstractTestNGSpringContextTests {
    ...
}

到目前为止,这对我们没有用...是否有任何机制可以实现这一目标?我找到了https://jira.spring.io/browse/SPR-11038,但我认为这不是解决这种情况的原因。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

是否有任何机制可以实现这一目标?

不,没有支持这种配置风格的机制。

自定义组合注释可以使用代替实际注释,不与实际注释结合使用。在核心Spring框架中也是如此(可能@Profile@Conditional除外)。

换句话说,您无法在同一个类中声明@ContextConfiguration和另一个使用@ContextConfiguration进行元注释的注释(例如,您的@BaseSpringTest)。如果你这样做,你会发现Spring只能找到其中一个声明。

但是,如果引入基类,则可以实现目标(尽管需要扩展该基类):

@BaseSpringTest
public abstract class AbstractBaseTests extends AbstractTestNGSpringContextTests {
    // ...
}

@ContextConfiguration(locations = {"/web/WEB-INF/spring-extension.xml" }, name = "parent")
public class MyTest extends AbstractBaseTests {
    // ...
}

当然,如果您要使用“基类”路线,那么自定义组合注释可能对您没那么有用。

此致

Sam(Spring TestContext Framework的作者)