如何创建和使用具有Spring + JUnit Test Config注释的自定义注释?

时间:2012-09-23 13:23:20

标签: java spring junit annotations

我有大量的测试用例,它们运行Spring Junit支持,每个测试都有以下注释。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")

我没有在每个Test类上放置所有这些注释,而是想创建一个自定义注释并使用它。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SpringJUnit4TestConfig {

}

但是当我使用这个自定义注释弹簧注入时根本没有发生。

@SpringJUnit4TestConfig
public class UserServiceTest
{
}

我在这里缺少什么?

PS: 但是JUnit的@RunWith和Spring的@Transactional,@ ContextConfiguration都有@ Inherited ..所以我认为它应该可行。但是现在我通过一个解决方案来解决这个问题。创建了一个基于抽象的类,并在其上放置了所有这些注释,并扩展了该基类的测试用例。

1 个答案:

答案 0 :(得分:2)

我不认为这种方法会起作用,因为@RunWith是JUnit注释,所以为了工作,JUnit注释必须是可传递的。

  

当一个类使用@RunWith注释或者扩展一个使用@RunWith注释的类时,JUnit将调用它引用的类来运行该类中的测试而不是内置于JUnit中的运行器。我们在开发后期添加了此功能。虽然它似乎很强大,但我们希望在我们了解人们如何真正使用它时,运行器API会发生变化。目前内部的一些课程可能会被改进并公之于众。

因此测试JUnit测试调用似乎只适用于继承的类。

对于Spring,它支持一个名为context configuration inheritance的配置位置,我不确定这是否适用于其他注释类型(如果您认为不是,请指向我的文档)实际上,在测试配置类继承的情况下,这可能适用于其他注释,因为@Transactional注释本身在这种情况下用@Inherited声明。

因此,在这种情况下,由于JUnit注释缺失,它不会运行。