6

我有大量使用 Spring Junit Support 运行的测试用例,每个测试都有以下注释。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("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 {

}

但是当我使用这个自定义注释时,Spring Injection 根本没有发生。

@SpringJUnit4TestConfig
public class UserServiceTest
{
}

我在这里缺少什么?

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

4

1 回答 1

3

我不认为这种方法会起作用,就像@RunWithJUnit 注释一样,所以要让它起作用,JUnit 注释必须是可传递的。

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

所以测试 JUnit 测试调用似乎只适用于继承的类。

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

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

于 2012-09-23T13:58:52.097 回答