【问题标题】:How can I use two beans (or more) that return String in main program and replace them with another two while testing?如何在主程序中使用两个(或更多)返回 String 的 bean,并在测试时用另外两个替换它们?
【发布时间】:2025-12-08 19:25:02
【问题描述】:

我有配置文件:

@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!但是无论如何,我怎样才能正确使用我的豆子呢?

【问题讨论】:

  • 不要使用File;它在运行时不可用。一般情况下,请改用 Spring Resource
  • @chrylis-cautiouslyoptimistic- 请您提供正确的代码而不是我的代码,或者更准确地解释如何实现您的想法?
  • 您在其他地方定义了测试配置吗?看起来您的测试也在读取 UrlAnalyzerConfiguration 文件。
  • @RikayanBandyopadhyay 不,我也想过这个,但没有其他地方
  • @chrylis-cautiouslyoptimistic-我曾尝试使用Resource,但出现同样的错误

标签: java spring spring-boot spring-test


【解决方案1】:

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

配置

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

测试

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

参考文献

  1. @Profile
  2. @ActiveProfiles

【讨论】:

    最近更新 更多