在带有spring上下文的单元测试中自动构建javax.inject.provider



在使用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;
...
}

相关内容

  • 没有找到相关文章

最新更新