[英]Autowiring a javax.inject.provider in a unit-test with spring context
在使用 javax 提供程序时,我创建了一个 spring 配置文件,其中包含以下两个 Bean:
@Bean
Provider<Map<Integer, JsonNode>> worldMapDataProvider() {
//code here
}
@Bean
Provider<List<Building>> buildingsDataProvider() {
//code here
}
我将这两个 bean 注入到两个不同的服务中,如下所示:
@Resource
private Provider<Map<Integer, JsonNode>> worldMapDataProvider;
@Resource
private Provider<List<Building>> buildingsDataProvider;
实现按预期工作,我的依赖控制器也以预期格式返回数据。 现在我想通过将提供程序自动装配到“我的测试设置”中来为我的实现添加一些单元测试。
最后工作的我的测试类的配置如下所示:
@SpringBootTest(classes={ResourceProviders.class, ResourceProviderUtils.class, Beans.class})
class ResourceProvidersTest {
ResourceProvider 是我想要使用的; 这个 class 依赖于 ResourceProviderUtils ,而 ResourceProviderUtils 又依赖于我在 Beans 中定义的 jackson objectMapper。 因此,所需的依赖链是 ResourceProviders -> ResourceProviderUtils -> Beans
现在,来回答我的问题。
我试图在不使用@SpringBootTest 的情况下为我的测试创建一个基于注释的解决方案。 准确地说,这是我期望的配置:
@ExtendWith(SpringExtension.class)
@ComponentScan("{myBasePackage}")
我注入这两个 Bean 的方式与我在服务中使用 @Resource 注释的方式完全相同。 但在测试用例中,我得到以下异常:
No qualifying bean of type 'java.util.List<{myBasePackage}.game.data.model.economy.buildings.Building>' available
您可以看到它不是在寻找 Provider<List> 类型的 bean,而是在寻找 List 类型的 bean。 不过,我从来没有做过这样的豆子,因此在任何地方也不需要它。 我总是将提供者注入我的服务(和这个测试用例)并使用 provider.get() 访问数据。
我有一种感觉,提供者正在以某种方式隐式解决,但这只是一个假设。 谁能向我解释这里到底发生了什么以及为什么? 我想更好地理解为什么在给定的配置下会发生这种情况。
@ComponentScan
不适用于@ExtendWith
,请改用@ContextConfiguration
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes={ResourceProviders.class, ResourceProviderUtils.class, Beans.class})
public class ResourceProvidersTest {
@Autowire ResourceProviders resourceProviders;
@Autowire ResourceProviderUtils resourceProviderUtil;
@Autowire Beans beans;
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.