如何在 JUnit spring 测试中仅自动装配特定的 class?
How to only autowire a specific class in JUnit spring test?
我想写一种集成测试,但只针对特定的 class。
这意味着我希望自动连接 class 中的所有字段,但忽略同一目录中的任何 classes。
这可能吗?
示例:
@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
提到的相同目录中的任何classes。
您可以使用过滤器来自定义扫描。在那里您可以使用这样的属性扩展 ComponentScan 注释:
@ComponentScan(
basePackages = {"com.my.package"},
useDefaultFilters = false,
includeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MyService.class, MyInjectedService.class})
})
@ContextConfiguration
和@SpringApplicationConfiguration
支持的classes
属性只需要引用注解的类;他们不必是 @Configuration
类.
所以考虑到这一点,您应该能够完全放弃组件扫描并简单地声明您的两个注释组件如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyService.class, MyInjectedService.class})
public class JUnitTest {
@Autowired
private MyService service;
// ...
}
话虽如此,如果以上是您的目标,那么使用 Spring Boot 的测试支持可能没有任何意义。换句话说,如果 MyService
和 MyInjectedService
不依赖 Spring Boot 的任何功能,您可以安全地将 @SpringApplicationConfiguration
替换为 @ContextConfiguration
。
此致,
Sam(Spring TestContext Framework 的作者)
我想写一种集成测试,但只针对特定的 class。 这意味着我希望自动连接 class 中的所有字段,但忽略同一目录中的任何 classes。
这可能吗?
示例:
@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
提到的相同目录中的任何classes。
您可以使用过滤器来自定义扫描。在那里您可以使用这样的属性扩展 ComponentScan 注释:
@ComponentScan(
basePackages = {"com.my.package"},
useDefaultFilters = false,
includeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = {MyService.class, MyInjectedService.class})
})
@ContextConfiguration
和@SpringApplicationConfiguration
支持的classes
属性只需要引用注解的类;他们不必是 @Configuration
类.
所以考虑到这一点,您应该能够完全放弃组件扫描并简单地声明您的两个注释组件如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyService.class, MyInjectedService.class})
public class JUnitTest {
@Autowired
private MyService service;
// ...
}
话虽如此,如果以上是您的目标,那么使用 Spring Boot 的测试支持可能没有任何意义。换句话说,如果 MyService
和 MyInjectedService
不依赖 Spring Boot 的任何功能,您可以安全地将 @SpringApplicationConfiguration
替换为 @ContextConfiguration
。
此致,
Sam(Spring TestContext Framework 的作者)