[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.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.기본적으로 @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.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)
from https://stackoverflow.com/questions/53139244/spring-boot-2-1-bean-override-vs-primary by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 팩토리 클래스에 의해 생성 된 객체에 대한 모의 객체 삽입 (0) | 2019.04.16 |
---|---|
[SPRING] @RequestBody가 null 값을 받고 있습니다. (0) | 2019.04.16 |
[SPRING] 스프링 부트 1.2.3의 경우 JSON 직렬화에서 null 값을 무시하도록 설정하는 방법은 무엇입니까? (0) | 2019.04.16 |
[SPRING] Spring 3.2 "@Scheduled"주석에 대한 예외 처리 (0) | 2019.04.16 |
[SPRING] 오류 발생 : JDBC 드라이버 클래스를로드 할 수 없습니다 [org.postgresql.Driver] (0) | 2019.04.16 |