首页 > 解决方案 > 如何在主程序中使用两个(或更多)返回 String 的 bean,并在测试时用另外两个替换它们?

问题描述

我有配置文件:

@Configuration
public class UrlAnalyzerConfiguration {

    @Bean
    @Qualifier("usersDatabase")
    public File getUsersDatabaseFile() {
        return Paths.get("src/main/resources/database/users.csv").toFile();
    }

    @Bean
    @Qualifier("urlsDatabase")
    public File getUrlsDatabaseFile() {
        return Paths.get("src/main/resources/database/urls.csv").toFile();
    }
}

和测试配置:

@TestConfiguration
public class TestConfig {

    @Bean
    @Qualifier("usersDatabase")
    public File getUsersDatabaseTestFile() {
        return Paths.get("src/test/resources/database/users.csv").toFile();
    }

    @Bean
    @Qualifier("urlsDatabase")
    public File getUrlsDatabaseTestFile() {
        return Paths.get("src/test/resources/database/urls.csv").toFile();
    }
}

我的存储库使用其中一个 bean:

    private final File usersDatabase;
    
    @Autowired
    public UserRepositoryImpl(@Qualifier("usersDatabase") File usersDatabase) {
        this.usersDatabase = usersDatabase;
    }

我的存储库测试文件:

@SpringBootTest
@Import(TestConfig.class)
public class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;
    
    // tests here
}

结果,我的主程序正常工作,但测试失败,最后显示以下消息:

通过构造函数参数 0 表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有“java.io.File”类型的合格 bean 可用:预期单个匹配 bean,但找到 2:getUsersDatabaseTestFile,getUsersDatabaseFile


我发现了问题:

除了应用程序的主要配置之外,还使用 ​​@TestConfiguration 类。这意味着,测试一起使用@Configuration 和@TestConfiguration!但无论如何,我怎样才能正确使用我的豆子呢?

标签: javaspringspring-bootspring-test

解决方案


您可以使用@Profile和的组合@ActiveProfiles仅加载测试所需的类。请参阅下面的原型。

配置

@Configuration
@Profile("test")
public class TestOnlyConfigs {
    // define beans
}

测试

@ActiveProfiles("test")
public class Tests {
    // write tests
}

参考

  1. @轮廓
  2. @ActiveProfiles

推荐阅读