【问题标题】:Java annotations - code simplificationsJava注解——代码简化
【发布时间】:2014-07-09 12:31:57
【问题描述】:

我正在寻找一种方法来简化以下代码。

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        // My configuration classes
})
public class MyServiceTest {
    @Autowired
    private MyService service;

    @Test
    public void myTest() {
        Assert.assertTrue(service != null);
    }
}

我有很多配置类,我不想把它们放到每个测试类中。所以我有了创建自己的注释的想法:

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        // My configuration classes
})
public @interface IntegrationTests {
}

我尝试通过以下方式使用它:

@IntegrationTests
public class MyServiceTest {
    @Autowired
    private MyService service;

    @Test
    public void myTest() {
        Assert.assertTrue(service != null);
    }
}

但它不起作用。有什么想法吗?

【问题讨论】:

  • @Autowired 表示春天,对吗?
  • @Thomas:是的,我使用 Spring。
  • 您是否尝试按照docs on spring's custom annotations 的指示添加@Target@Retention
  • @Thomas:不,我没有,但我尝试使用 axtavt 的解决方案并且效果很好。所以,问题就解决了。感谢您的回复。

标签: java spring testing annotations spring-test


【解决方案1】:

您可以将这些注释放在超类上:

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        // My configuration classes
})
public abstract class AbstractIntegrationTest { ... }

.

public class MyServiceTest extends AbstractIntegrationTest { ... }

这种方法还允许您在基类中声明常见的@Autowired 依赖项,并在具体测试中自定义@ContextConfiguration 类。

【讨论】:

    【解决方案2】:

    您的自定义组合注释 不起作用的原因是JUnit 不支持将@RunWith 作为元注释。因此,当您按如下方式编写注释时...

    @WebAppConfiguration
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = { /* configuration classes */ })
    public @interface IntegrationTests {
    }
    

    ... JUnit 看不到您要使用SpringJUnit4ClassRunner

    Spring Framework 4.0 及更高版本应该可以毫无问题地看到 @WebAppConfiguration@ContextConfiguration 的声明用作元注释。

    换句话说,以下内容应该适合您:

    @WebAppConfiguration
    @ContextConfiguration(classes = { /* configuration classes */ })
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface IntegrationTests {
    }
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @IntegrationTests
    public class MyServiceTest {
        @Autowired
        private MyService service;
    
        @Test
        public void myTest() {
            assertNotNull(service);
        }
    }
    

    作为替代方案,您可以使用 axtavt 推荐的 abstract 基础测试类。

    问候,

    Sam(Spring TestContext 框架的作者)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多