Loading...
Spring Framework Reference Documentation 7.0.2의 @TestBean의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
@TestBean@TestBean
은 test class의 non-static field에 사용되어 test의
ApplicationContext에서 특정 bean을 factory method가 제공하는 instance로 override하는 데 사용됩니다.
연관된 factory method name은 annotation이 적용된 field name 또는 지정된 경우 bean name에서 유도됩니다. factory method는 static이어야 하고, argument를 받지 않으며, override할 bean type과 호환되는 return type을 가져야 합니다.
더 명시적으로 만들거나 다른 name을 사용하고 싶은 경우, annotation을 통해 특정 method name을 제공할 수 있습니다.
기본적으로, annotation이 적용된 field의 type이 override 후보 bean을 검색하는 데 사용됩니다. 여러 후보가 일치하는 경우, override할 후보를 좁히기 위해 @Qualifier를 제공할 수 있습니다.
또는 bean name이 field name과 일치하는 후보가 일치하게 됩니다.
해당 bean이 존재하지 않는 경우 bean이 생성됩니다. 그러나 해당 bean이 존재하지 않을 때 test가 실패하도록 하려면 enforceOverride attribute를 true로 설정할 수 있습니다.
예를 들어, @TestBean(enforceOverride = true)와 같이 설정합니다.
by-type override 대신 by-name override를 사용하려면, annotation의 name attribute를 지정합니다.
field name을 포함한 Qualifier는 별도의
ApplicationContext를 생성해야 하는지 여부를 결정하는 데 사용됩니다. 이 기능을 사용하여 여러 test에서 동일한 bean을 override하는 경우, 불필요한 context 생성을 피하기 위해 field name을 일관되게 지정해야 합니다.
@ContextHierarchy와 함께@TestBean을 사용하면 각@TestBean이 기본적으로 모든 context hierarchy level에 적용되므로 바람직하지 않은 결과를 초래할 수 있습니다. 특정@TestBean이 단일 context hierarchy level에 적용되도록 하려면, 구성된@ContextConfigurationname과 일치하도록contextNameattribute를 설정해야 합니다. 예를 들어,@TestBean(contextName = "app-config")와 같이 설정합니다. 자세한 내용과 예제는 context hierarchies with bean overrides를 참조하십시오.
@TestBeanfield나 factory method의 visibility에는 제한이 없습니다. 따라서 이러한 field와 method는 프로젝트의 필요나 코딩 관례에 따라public,protected, package-private(default visibility), 또는private가 될 수 있습니다.
다음 예제는 @TestBean annotation의 기본 동작을 사용하는 방법을 보여줍니다:
1class OverrideBeanTests { 2 @TestBean // (1) 3 CustomService customService; 4 5 // test case body... 6 7 static CustomService customService() { // (2) 8 return new MyFakeCustomService(); 9 } 10}
| 1 | type이 CustomService인 bean을 override하기 위해 field를 표시합니다. |
| 2 | 이 static method의 결과가 instance로 사용되어 field에 injection됩니다. |
위의 예제에서 우리는 type이 CustomService인 bean을 override하고 있습니다. 해당 type의 bean이 둘 이상 존재하는 경우, name이 customService인 bean이 고려됩니다. 그렇지 않으면 test는 실패하고, 어떤 CustomService bean을 override할지 식별하기 위해 어떤 형태로든 qualifier를 제공해야 합니다.
다음 예제는 by-type lookup이 아닌 by-name lookup을 사용합니다:
1class OverrideBeanTests { 2 @TestBean(name = "service", methodName = "createCustomService") // (1) 3 CustomService customService; 4 5 // test case body... 6 7 static CustomService createCustomService() { // (2) 8 return new MyFakeCustomService(); 9 } 10}
| 1 | name이 service인 bean을 override하기 위해 field를 표시하고, factory method name이 createCustomService임을 지정합니다. |
| 2 | 이 static method의 결과가 instance로 사용되어 field에 injection됩니다. |
호출할 factory method를 찾기 위해, Spring은
@TestBeanfield가 선언된 class, 그 superclass 중 하나, 또는 구현된 어떤 interface에서 검색합니다.@TestBeanfield가@Nestedtest class에 선언된 경우, enclosing class hierarchy도 검색됩니다. 또는, 외부 class의 factory method는<fully-qualified class name>#<method name>syntax를 따르는 fully-qualified method name을 통해 참조할 수 있습니다. 예를 들어,methodName = "org.example.TestUtils#createCustomService"와 같이 지정할 수 있습니다.
non-singleton bean을 override할 때, non-singleton bean은
@TestBeanfactory method가 반환하는 값에 해당하는 singleton bean으로 대체되고, 해당 bean definition은singleton으로 변환됩니다. 결과적으로,@TestBean이prototype또는 scoped bean을 override하는 데 사용되면, override된 bean은singleton으로 취급됩니다. 마찬가지로,FactoryBean이 생성한 bean을 override할 때,FactoryBean은@TestBeanfactory method가 반환하는 값에 해당하는 singleton bean으로 대체됩니다.
@DynamicPropertySource
@MockitoBean and @MockitoSpyBean