我有一颗豆子:

@Bean("imageKitPath")
public String imageKitPath() {
    return "/main";
}

然而,在测试中,我希望这个Bean具有/test值.我成功地实现了这一点:

@Bean
@Primary
public String imageKitPath2() {
    return "/test";
}

现在,问题来了.我还成功地实现了基于JWT的身份验证.然而,我希望有不同的签名测试和生产.

在我的生产代码中,我有一个带有JWT签名的Bean:

@Bean("jwtKey")
public String jwtKey() {
    // some logic to read key from file
    return jwtKey;
}

并且,与前面的示例类似,在测试中它看起来如下所示:

@Bean
@Primary
public String jwtKey2() {
    // some logic to read key from application.properties
    return jwtKey;
}

这两个Bean都是正确创建的,并且都有我期望它们具有的值.问题在于将这些值注入其他组件.例如,在我的JwtService个班级(这是@Service个注释的班级)中,我很难将它们自动化.我已经try 了多种解决方案.

1.

private final String jwtKey;

@Autowired
public JwtService(String jwtKey) {
    this.jwtKey = jwtKey;
}

在没有第二个Bean(jwtKey2)的生产中,这将工作得很好.但是,测试将无法加载具有org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: more than one 'primary' bean found among candidates的上下文.

2.

private final String jwtKey;

@Autowired
public JwtService(@Qualifier("jwtKey") String jwtKey) {
    this.jwtKey = jwtKey;
}

同样,在生产中可以工作,但在测试中它将使用产品的JWT值,而不是我在测试中指定的值.

3.

private final String jwtKey;

@Autowired
public JwtService(@Qualifier("jwtKey2") String jwtKey) {
    this.jwtKey = jwtKey;
}

这个在测试中可以正常工作,但是--显然--在生产中会失败,因为没有jwtKey2Bean.

我描述imageKitPath Bean的原因很简单.因为测试指定了一个使用@Primary覆盖imageKitPath的Bean,所以我认为Spring无法区分imageKitPath2jwtKey2.删除imageKitPath个Bean完全解决了JWT的Bean问题.

推荐答案

您要实现的目标看起来像是一个完美的属性用例.因此,您的提供者Bean将如下所示:

@Configuration
@ConfigurationProperties(prefix = "imageKit")
public class ConfigProperties {
    
    private String path;

    // getters, setters

}

应用程序.属性:

imageKit.path="/main"

此处的字段path将映射到您的application.properties中的imageKit.path.为了进行测试,您可以在test文件夹中提供一个不同的application.properties文件,动态替换所提供的值.如果您需要更多并行的值,请考虑使用配置文件.

Java相关问答推荐

为什么JFrame paint()多次绘制同一点(或根本不绘制)?

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

如何使用jooq generator将表名和列名映射为人类可读的?

我无法将附件发送到NetBeans之外

无法处理批处理侦听器中的反序列化异常

为什么我的ArrayList索引的索引总是返回-1?

确定Java中Math.Ranb()输出的上限

相同的Java SerializedLambda为implMethodKind返回不同的结果

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

搜索列表返回多个频道

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

如果执行@BeForeEach#repository.save(),则测试中的UnitTest最终UUID会发生更改

用于Java的Visual Studio代码完成不起作用

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

如何在Spring Security中设置一个任何人都可以打开的主页?

spring 更新多项管理关系

如何用Micrometer&;斯普肯

Java方法参数:括号中的类型声明?

UuidGenerator Bean 类型不匹配?