如何在JUnit Spring测试中只自动连接一个特定的类?

3phpmpom  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(142)

我想写一种集成测试,但只针对一个特定的类,这意味着我想自动连接该类中的所有字段,但忽略同一目录中的任何类。
这可能吗?
示例:

@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相同目录中的任何类。

23c0lvtd

23c0lvtd1#

@ContextConfiguration@SpringApplicationConfiguration支持的classes属性只需要引用 * 带注解的类 *;它们不必是@Configuration类。
因此,记住这一点,您应该能够完全放弃组件扫描,而简单地声明两个带注解的组件,如下所示:

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

    // ...
}

换句话说,如果MyServiceMyInjectedService不依赖于Spring Boot的任何特性,那么您可以安全地将@SpringApplicationConfiguration替换为@ContextConfiguration
此致!
Sam(*Spring测试上下文框架 * 的作者)

fruv7luv

fruv7luv2#

您可以使用筛选器来自定义扫描。在那里,您可以使用如下所示的属性扩展ComponentScan注解:

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

1tu0hz3e3#

您可以使用@Import注解。它比@ComponentScan注解更易读,也更简短。

import org.springframework.context.annotation.Import;

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

    // ...
}

相关问题