복붙노트

[SPRING] 스프링 부트 2.1 빈 오버라이드 대 기본

SPRING

스프링 부트 2.1 빈 오버라이드 대 기본

스프링 부트 2.1을 사용하면 기본적으로 빈 오버라이드가 비활성화되어 있기 때문에 좋은 일입니다.

그러나 나는 빈을 Mockito를 사용하여 조롱 된 인스턴스로 대체하는 몇 가지 테스트를 수행한다. 기본 설정의 경우 Bean 재 지정으로 인해 그러한 구성으로 테스트 할 수 없습니다.

내가 찾은 유일한 방법은 응용 프로그램 속성을 통해 bean 재정의를 활성화하는 것입니다.

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

그러나 나는 테스트 구성을위한 최소한의 bean 정의 셋업을 보장하고 싶다. 이것은 오버라이드가 비활성화 된 스프링에 의해 지적 될 것이다.

내가 오버라이드하는 콩은

필자가 생각한 바는 테스트 환경에서 빈을 오버라이드하고 @Primary를 두드려 야한다. 데이터 소스 설정에 익숙하기 때문이다. 그러나 이것은 아무런 효과가 없으며 궁금해합니다. @Primary와 Disabled 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);
    }
}

해결법

  1. ==============================

    1.Bean을 겹쳐 쓰는 것은 컨텍스트에 고유 한 이름이나 ID를 가진 Bean이 하나만있을 수 있음을 의미합니다. 따라서 다음과 같이 두 개의 빈을 제공 할 수 있습니다.

    Bean을 겹쳐 쓰는 것은 컨텍스트에 고유 한 이름이나 ID를 가진 Bean이 하나만있을 수 있음을 의미합니다. 따라서 다음과 같이 두 개의 빈을 제공 할 수 있습니다.

    package com.stackoverflow.foo;
    @Configuration
    public class BaseConfiguration {
       @Bean
       @Lazy
       public BService bService1() {
           return new BService();
       }
    }
    
    package com.stackoverflow.bar;
    @Configuration
    @Import({BaseConfiguration.class})
    public class TestConfiguration {
        @Bean
        public BService bService2() {
            return Mockito.mock(BService.class);
        }
    }
    

    @Primary를 추가하면 기본적으로 기본 bean이 삽입됩니다.

    @Autowired
    BService bService;
    
  2. ==============================

    2.기본적으로 @Component를 @Bean으로 대체 할 수 있습니다. 귀하의 경우

    기본적으로 @Component를 @Bean으로 대체 할 수 있습니다. 귀하의 경우

    @Service
    public class AService {
    }
    
    @Component
    public class BService {
        @Autowired
        public BService() { ... }
    }
    
    @Configuration
    @ComponentScan
    public BaseConfiguration {
    }
    
    @Configuration
    // WARNING! Doesn't work with @SpringBootTest annotation
    @Import({BaseConfiguration.class})
    public class TestConfiguration {
        @Bean // you allowed to override @Component with @Bean.
        public BService bService() {
            return Mockito.mock(BService.class);
        }
    }
    
  3. ==============================

    3.spring.main.allow-bean-definition-overriding = true를 테스트 구성에 배치 할 수 있습니다. 광범위한 통합 테스팅이 필요하다면, 어떤 시점에서 빈을 오버라이드 (override)해야 할 필요가있다. 피할 수없는 일입니다.

    spring.main.allow-bean-definition-overriding = true를 테스트 구성에 배치 할 수 있습니다. 광범위한 통합 테스팅이 필요하다면, 어떤 시점에서 빈을 오버라이드 (override)해야 할 필요가있다. 피할 수없는 일입니다.

    올바른 답변이 이미 제공 되었더라도 콩이 다른 이름을 가지므로 기술적으로 오버라이드가 아니라는 것을 의미하는 한 번 더 강조하고 싶었습니다. Spring 부트 2.X부터 시작하여 @Qualifiers, @Resources 또는 유사한 것을 사용하기 때문에 필요하다면 spring.main.allow-bean-definition-overriding = true로만 가능하다.

    최신 정보: Kotlin Bean Definition DSL에주의하십시오. Spring Boot에서는 다음과 같이 사용자 정의 ApplicationContextInitializer가 필요합니다.

    class BeansInitializer : ApplicationContextInitializer<GenericApplicationContext> {
    
        override fun initialize(context: GenericApplicationContext) =
                beans.initialize(context)
    
    }
    

    이제 @Primary @Bean 메서드를 통해 테스트에서 이러한 DSL 기반 빈 중 하나를 재정의하기로 결정한 경우에는 수행되지 않습니다. 이니셜 라이저는 @Bean 메소드 이후에 시작될 것이고 테스트 @Bean에 @Primary가있는 경우에도 테스트에서 초기 DSL 기반 빈을 얻게 될 것입니다. 또 다른 옵션은 테스트 용 테스트 초기화 프로그램을 만들어 테스트 속성에 모두 나열하는 것입니다 (순서 문제).

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

    Bean 정의 DSL은 다음을 통해 기본 속성도 지원합니다.

    bean(isPrimary=true) {...}
    

    - bean을 삽입하려고 할 때 모호함을 없애기 위해 필요한, main : allow-bean-definition-overriding : 당신이 순수한 DSL 방식으로 간다면 true는 필요 없다.

    (스프링 부트 2.1.3)

  4. from https://stackoverflow.com/questions/53139244/spring-boot-2-1-bean-override-vs-primary by cc-by-sa and MIT license