2012-09-23 70 views
5

我有大量的测试用例与Spring Junit支持一起运行,每个测试都有以下注释。如何创建和使用具有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都具有@继承。所以我认为它应该工作。但现在我通过解决方案来解决它。创建一个基于抽象的类,并将所有这些注释和测试用例扩展到该基类。

+0

我应该只使用@Target({ElementType.TYPE})我不认为你会在字段或参数中使用它,或者你会吗? – Koitoer

+0

你说得对。此自定义注释应该仅在ElementType.TYPE上应用。 –

+0

我也想做完全一样的。阅读问题和答案我创建了一个使用除'@ RunWith'之外的所有配置的注释,并且目前看起来运行良好。我在每个TestCase类上使用'@RunWith(SpringJUnit4ClassRunner.class)'。 – ykesh

回答

2

我不认为这种方法会起作用,因为@RunWith是JUnit注释,因此为了实现这个功能,JUnit注释必须是可传递的。

当一个类被注解为@RunWith或延长使用@RunWith注释的类,JUnit会调用它引用运行在类,而不是内置的JUnit亚军测试的类。我们在开发的后期增加了这个功能。虽然看起来很强大,但我们希望跑步者API能够在我们了解人们真正使用它的过程中发生变化。目前内部的一些课程可能会被完善并公开。

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

至于春天,它支持的配置位置称为context configuration inheritance的事情, 我非常不知道这应该对其他注释类型的工作(请点我的文档,如果你认为其他) 其实,这在测试配置类继承的情况下可能适用于其他注释,因为@Transactional注释本身在此情况下用@Inherited声明。

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