Spring测试:如何默认配置为@AnnotationDriven?

时间:2014-05-05 18:34:10

标签: java spring spring-test

目前我的课程似乎是

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = {DemographicAttributesManager.class})
public class DemographicAttributesManagerTest {

    @Autowired
    private DemographicAttributesManager demographicAttributesManager;

    @Test
    public void testGetGenders() throws Exception {
        final Map<Integer, String> genders = demographicAttributesManager.getGenders();
        assertEquals(3, genders.size());
    }
}

我不喜欢什么?

  1. 在每个Test类中我都要包含
  2.   

    @RunWith(SpringJUnit4ClassRunner.class)来

    有没有办法默认它?以便每个测试都与该课程一起运行?

    1. 我必须输入
    2.   

      @ContextConfiguration(loader = AnnotationConfigContextLoader.class,   classes = {DemographicAttributesManager.class})   告诉要包含哪些类,以及它是注释驱动的测试。

      有没有办法将默认设置为package扫描类,默认情况下我不必放AnnotationConfigContextLoader

      由于

2 个答案:

答案 0 :(得分:6)

  

在每个Test课程中,我都必须包含@RunWith(SpringJUnit4ClassRunner.class)

     

有没有办法默认它?以便每个测试都与该课程一起运行?

不,没有办法更改JUnit的默认Runner。 JUnit将默认Runner定义为org.junit.runners.JUnit4。因此,如果您想使用其他跑步者(例如SpringJUnit4ClassRunner),则必须明确声明。这就是JUnit的工作原理。

然而,正如其他人指出的那样,@RunWith注释是继承的。因此,您可以在项目中的其他测试类扩展的基础测试类中声明它。

  

我必须输入@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = {DemographicAttributesManager.class})来告诉要包含哪些类,以及它是注释驱动的测试。

需要明确声明AnnotationConfigContextLoader作为加载器。每当您声明classes的{​​{1}}属性时,Spring会自动为您使用@ContextConfiguration。如果您声明静态内部AnnotationConfigContextLoader类,从而使用默认检测机制,情况也是如此。

在相应的Javadoc以及Testing chapter of the Spring Reference Manual中都记录了这一点。

  

有没有办法将默认设置为类扫描包,默认情况下我不需要放置AnnotationConfigContextLoader?

关于@Configuration,请参见上文。

关于软件包扫描,不,在使用AnnotationConfigContextLoader时,没有明确支持软件包扫描;但是,使用带有@ContextConfiguration注释的静态内部@Configuration类,当然可以为给定包配置组件扫描。当然,您也可以在使用@ComponentScan注释的同一基础测试类中声明该配置。

此致

Sam(Spring TestContext Framework的作者)

答案 1 :(得分:0)

@RunWith和@ContextConfiguration(loader = ...)可以从基础测试类继承。 我不知道如何避免每个测试类的@ContextConfiguration(classes = ...)。 但我不认为摆脱它是一个非常有用的功能:我更喜欢使用mockito和没有@RunWith(spring)进行真正的单元测试,并且有真正的集成测试可以加载整个应用程序上下文(这将是在所有测试中被春天缓存。)