繁体   English   中英

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

[英]How to only autowire a specific class in 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相同目录中的任何类。

@ContextConfiguration@SpringApplicationConfiguration支持的classes属性只需要引用注解的类 它们不必是@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 框架的作者)

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

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

您可以使用@Import注释。 它比使用@ComponentScan注释更具可读性和更短。

import org.springframework.context.annotation.Import;

@Import(value = {MyService.class, MyInjectedService.class})
public class JUnitTest {
    @Autowired
    private MyService service;

    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM