Java注释 - 代码简化

use*_*391 2 java testing spring annotations spring-test

我正在寻找一种简化以下代码的方法.

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

    @Test
    public void myTest() {
        Assert.assertTrue(service != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        // My configuration classes
})
public @interface IntegrationTests {
}
Run Code Online (Sandbox Code Playgroud)

我尝试以下列方式使用它:

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

    @Test
    public void myTest() {
        Assert.assertTrue(service != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.任何的想法?

axt*_*avt 7

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

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        // My configuration classes
})
public abstract class AbstractIntegrationTest { ... }
Run Code Online (Sandbox Code Playgroud)

.

public class MyServiceTest extends AbstractIntegrationTest { ... }
Run Code Online (Sandbox Code Playgroud)

此方法还允许您@Autowired在基类中声明公共依赖项,并@ContextConfiguration在具体测试中自定义类.


Sam*_*nen 7

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

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { /* configuration classes */ })
public @interface IntegrationTests {
}
Run Code Online (Sandbox Code Playgroud)

... 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以使用abstractaxtavt建议的基础测试类.

问候,

Sam(Spring TestContext Framework的作者)