在使用javax提供程序时,我创建了一个包含以下两个bean的spring配置文件:
@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;
实现按预期工作,并且我的依赖控制器也以预期的格式返回数据。现在我想为我的实现添加一些单元测试,方法是在我的test-setup中自动添加这些提供程序。
我的测试类的配置在最后工作如下:@SpringBootTest(classes={ResourceProviders.class, ResourceProviderUtils.class, Beans.class})
class ResourceProvidersTest {
ResourceProvider是我想使用的;这个类依赖于ResourceProviderUtils,而后者又依赖于我在Beans中定义的jackson objectMapper。因此,所需的依赖链是ResourceProviders ->ResourceProviderUtils→豆子
现在,回到我的问题.我试图为我的测试创建一个基于注释的解决方案,而不使用@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类型的bean,而是在寻找List类型的bean。我从来没有声明过这样一个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;
...
}
或使用@SpringJUnitConfig
;这个注释结合了@ExtendWith(SpringExtension.class)
和@ContextConfiguration
@SpringJUnitConfig(classes={ResourceProviders.class, ResourceProviderUtils.class, Beans.class})
public class ResourceProvidersTest {
@Autowire ResourceProviders resourceProviders;
@Autowire ResourceProviderUtils resourceProviderUtil;
@Autowire Beans beans;
...
}