我正在寻找一种简化以下代码的方法。
@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);
}
}
但它不起作用。有什么想法吗?
答案 0 :(得分:7)
您可以将这些注释放在超类上:
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
// My configuration classes
})
public abstract class AbstractIntegrationTest { ... }
public class MyServiceTest extends AbstractIntegrationTest { ... }
此方法还允许您在基类中声明常见的@Autowired
依赖项,并在具体测试中自定义@ContextConfiguration
类。
答案 1 :(得分:7)
您的自定义组合注释不起作用的原因是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 Framework的作者)