首页 > 解决方案 > 注释@ConditionalOnMissingBean 在测试中不匹配

问题描述

我有一个接口的两个实现 - 默认和开发。我@ConditionalOnProperty用于默认实现和组合@Profile以及@ConditionalOnMissingBean开发实现。

@Service
@ConditionalOnProperty(prefix = "keystore", value = "file")
public class DefaultKeyStoreService implements KeyStoreService {

@Service
@Profile("dev")
@ConditionalOnMissingBean(KeyStoreService.class)
public class DevKeyStoreService implements KeyStoreService {

现在,问题正在测试DevKeyStoreServiceTestDevKeyStoreService。我有这样的配置:

@SpringBootTest(
    classes = {DevKeyStoreService.class},
    properties = {"keystore.file="}
)
@RunWith(SpringRunner.class)
@ActiveProfiles("dev")
public class DevKeyStoreServiceTest {

    @Autowired
    private DevKeyStoreService tested;

    @Test
    public void testPrivateKey() {
    } //... etc.

结果是:

Negative matches:
-----------------
DevKeyStoreService:
   Did not match:
      - @ConditionalOnMissingBean (types: service.crypto.KeyStoreService; SearchStrategy: all) found bean 'devKeyStoreService' (OnBeanCondition)

和典型的org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'service.crypto.DevKeyStoreServiceTest'...

如何配置测试类以使其能够运行?

标签: javaspringspring-boot

解决方案


好的,我想通了。

带有值的注释@ConditionalOnMissingBean(KeyStoreService.class)试图只找到具体的实例,而KeyStoreService不是接口。这样,它什么也找不到。

当我使用带类型的注释时,它就像一个魅力:@ConditionalOnMissingBean(type = "KeyStoreService")


推荐阅读