繁体   English   中英

使用 spring 上下文在单元测试中自动装配 javax.inject.provider

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM