gpt4 book ai didi

java - Spring Boot 2.1 bean 覆盖与 Primary

转载 作者:IT老高 更新时间:2023-10-28 13:51:37 30 4
gpt4 key购买 nike

Spring Boot 2.1 bean overriding is disabled默认情况下,这是一件好事。

但是我确实有一些测试,我使用 Mockito 将 bean 替换为模拟实例。使用默认设置,这种配置的测试将由于 bean 覆盖而失败。

我发现唯一可行的方法是通过应用程序属性启用 bean 覆盖:

spring.main.allow-bean-definition-overriding=true

但是我真的很想确保为我的测试配置设置最少的 bean 定义,spring 会在禁用覆盖的情况下指出这一点。

我要覆盖的 bean 要么是

  • 在导入到我的测试配置中的另一个配置中定义
  • 通过注解扫描自动发现 bean

我的想法应该在覆盖 bean 的测试配置中工作,并在其上添加 @Primary,就像我们习惯于数据源配置一样。然而,这没有任何效果,让我想知道:@Primary 和禁用的 bean 覆盖是否矛盾?

一些例子:

package com.stackoverflow.foo;
@Service
public class AService {
}

package com.stackoverflow.foo;
public class BService {
}

package com.stackoverflow.foo;
@Configuration
public BaseConfiguration {
@Bean
@Lazy
public BService bService() {
return new BService();
}
}

package com.stackoverflow.bar;
@Configuration
@Import({BaseConfiguration.class})
public class TestConfiguration {
@Bean
public BService bService() {
return Mockito.mock(BService.class);
}
}

最佳答案

spring.main.allow-bean-definition-overriding=true 可以放在测试配置中。如果您需要广泛的集成测试,您将需要在某些时候覆盖 bean。这是不可避免的。

虽然已经提供了正确的答案,但这意味着您的 bean 将具有不同的名称。所以,从技术上讲,它不是一个覆盖。

如果您需要真正的覆盖(因为您使用 @Qualifiers@Resources 或类似的东西),因为 Spring Boot 2.X 只能使用 spring.main.allow-bean-definition-overriding=true 属性。

更新:小心 Kotlin Bean 定义 DSL。在 Spring Boot 中,它需要一个自定义的 ApplicationContextInitializer,如下所示:

class BeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {

override fun initialize(context: GenericApplicationContext) =
beans.initialize(context)

}

现在,如果您决定通过 @Primary @Bean 方法在测试中覆盖此类基于 DSL 的 bean 之一,它不会这样做。初始化程序将在 @Bean 方法之后启动,即使在测试 @ 上使用 @Primary bean 。另一种选择是为您的测试创建一个测试初始化​​程序并将它们全部列在您的测试属性中,就像这样(顺序很重要):

context:
initializer:
classes: com.yuranos.BeansInitializer, com.yuranos.TestBeansInitializer

Bean 定义 DSL 还支持主要属性通过:

bean(isPrimary=true) {...}

- 当您尝试注入(inject) bean 时,您需要消除歧义,但是如果您使用纯 DSL,则不需要 main:allow-bean-definition-overriding: true方式。

(Spring Boot 2.1.3)

关于java - Spring Boot 2.1 bean 覆盖与 Primary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53139244/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com