提问者:小点点

如何在 JUnit Spring测试中只自动连线特定类?


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

这可能吗?

例子:

@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 忽略与提到的两个 basePackageClass 相同目录中的任何类。


共3个答案

匿名用户

@ContextCon人和@Spring应用配置支持的属性只需要引用带注释的类;它们不一定是@配置类。

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

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

    // ...
}

话虽如此,如果以上是你的目标,它可能没有任何意义使用Spring Boot的测试支持。换句话说,如果< code>MyService和< code>MyInjectedService不依赖于Spring Boot的任何功能,则可以安全地将< code > @ SpringApplicationConfiguration 替换为< code > @ context configuration 。

问候

Sam(Spring TestContext Framework的作者)

匿名用户

您可以利用过滤器来定制扫描。在那里,您可以用如下属性扩展ComponentScan注释:

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

匿名用户

您可以使用< code>@Import批注。它比使用< code>@ComponentScan注释可读性更强,也更短。

import org.springframework.context.annotation.Import;

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

    // ...
}