如何在JUnit弹簧测试中仅自动装配特定类?

时间:2015-02-17 10:48:25

标签: java spring junit spring-test

我想编写一种集成测试,但仅针对特定类。 这意味着我希望该类中的所有字段都自动连线,但忽略同一目录中的任何类。

这可能吗?

示例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {TestConfig.class})
public class JunitTest {
    @Autowired
    private MyService service;
}

//how to only scan that specific class?
@ComponentScan(basePackageClasses = {MyService.class, MyInjectedService.class})
@Configuration
public class TestConfig {

}


@Service
public class MyService {
    @Autowired
    private MyInjectedService service;
}

在这里,我希望spring忽略与所提及的basePackageClasses相同的目录中的任何类。

2 个答案:

答案 0 :(得分:3)

您可以使用过滤器来自定义扫描。在那里,您可以使用以下属性扩展ComponentScan Annotation:

@ComponentScan(
basePackages = {"com.my.package"}, 
useDefaultFilters = false,
includeFilters = {
    @Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MyService.class, MyInjectedService.class})
})

答案 1 :(得分:3)

classes@ContextConfiguration支持的@SpringApplicationConfiguration属性仅需要引用带注释的类;它们不一定是@Configuration类。

因此,考虑到这一点,您应该能够完全放弃组件扫描并简单地声明两个带注释的组件,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyService.class, MyInjectedService.class})
public class JUnitTest {
    @Autowired
    private MyService service;

    // ...
}

话虽如此,如果以上是您的目标,那么使用Spring Boot的测试支持可能没有任何意义。换句话说,如果MyServiceMyInjectedService不依赖于Spring Boot的任何功能,您可以安全地将@SpringApplicationConfiguration替换为@ContextConfiguration

此致

Sam( Spring TestContext Framework的作者