유닛 테스트에서의 자동 배선 빈 덮어쓰기
특정 유닛 테스트에서 자동배선 콩을 쉽게 덮어쓸 수 있는 간단한 방법이 있습니까?컴파일 클래스에는 모든 유형의 빈이1개밖에 없기 때문에 이 경우 자동배선에는 문제가 없습니다.테스트 클래스에는 추가 모크가 포함됩니다.유닛 테스트를 실행할 때 기본적으로 이 유닛 테스트를 실행하는 동안 표준 콩 대신 이 모크를 사용한다는 추가 구성을 지정하기만 하면 됩니다.
프로파일은 필요한 것에 비해 다소 과잉인 것 같습니다.또, 유닛 테스트마다 다른 모크가 있는 경우가 있기 때문에, 프라이머리 주석으로 이것을 실현할 수 있을지는 잘 모르겠습니다.
단순히 테스트에서 다른 콩을 제공하고자 한다면 스프링 프로파일이나 모키토를 사용할 필요가 없다고 생각합니다.
다음 작업을 수행합니다.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { TestConfig.class })
public class MyTest
{
@Configuration
@Import(Application.class) // the actual configuration
public static class TestConfig
{
@Bean
public IMyService myService()
{
return new MockedMyService();
}
}
@Test
public void test()
{
....
}
}
메모: 스프링 부트 1.3.2/스프링 4.2.4로 테스트 완료
Spring Boot 1.4에는 다음과 같은 간단한 방법이 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MyApplication.class })
public class MyTests {
@MockBean
private MyBeanClass myTestBean;
@Before
public void setup() {
...
when(myTestBean.doSomething()).thenReturn(someResult);
}
@Test
public void test() {
// MyBeanClass bean is replaced with myTestBean in the ApplicationContext here
}
}
저도 비슷한 문제가 있어서 믹스로 해결했는데 이게 더 유용하고 재사용이 가능하더라고요.테스트용 스프링프로파일과 매우 간단한 방법으로 목격한 콩을 덮어쓰는 컨피규레이션클래스는 다음과 같습니다.
@Profile("test")
@Configuration
@Import(ApplicationConfiguration.class)
public class ConfigurationTests {
@MockBean
private Producer kafkaProducer;
@MockBean
private SlackNotifier slackNotifier;
}
이렇게 하면 @Autowire the make beans와 mockito를 사용하여 검증할 수 있습니다.주요 장점은 이제 모든 테스트에서 테스트별 변경 없이 심리스하게 모의 콩을 얻을 수 있다는 것입니다.테스트 대상:
스프링 부트 1.4.2
다양한 컨텍스트에서 사용하는 빈의 종류를 알기 위해서는 스프링 프로파일을 사용해야 합니다.
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
Spring Boot 1.4.0 이후로는 명시적으로 지정하지 않고@Configuration
테스트의 경우 주석을 단 정적 중첩 클래스를 추가합니다.@TestConfiguration
대체품을 제공하다@Bean
으로 주석을 단.@Primary
.
@TestConfiguration
Spring Boot의 프라이머리 테스트콘텍스트에 추가됩니다(즉, 실가동 빈은 계속 작성됩니다).@TestConfiguration
사용되는 이유는@Primary
.
mats.nowak씨가 언급했듯이@ContextConfiguration
도움이 됩니다.
부모 테스트 클래스는 다음과 같습니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/some-dao-stuff.xml"
,"classpath:spring/some-rest-stuff.xml"
,"classpath:spring/some-common-stuff.xml"
,"classpath:spring/some-aop-stuff.xml"
,"classpath:spring/some-logging-stuff.xml"
,"classpath:spring/some-services-etc.xml"
})
public class MyCompaniesBigTestSpringConfig {
...
하위 테스트 클래스 만들기:
package x.y.z;
@ContextConfiguration
public class MyOneOffTest extends MyCompaniesBigTestSpringConfig {
...
src/test/resources/x/y/z/MyOneOffTest-context.xml을 입력합니다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="widgetsService" class="com.mycompany.mydept.myservice.WidgetsService" primary="true" />
</beans>
그거widgetsService
bean은 main config xml(또는 Java config)에 정의되어 있는 bean을 덮어씁니다.inheritLocations에 대해 참조하십시오.기본 -context.xml 파일도 적어둡니다.예를 들어 보겠습니다.업데이트:덧붙여야만 했다primary="true"
필요한 것 같아요
언급URL : https://stackoverflow.com/questions/28605833/overriding-an-autowired-bean-in-unit-tests
'bestsource' 카테고리의 다른 글
Rest API 플러그인 wordpress 기본 경로 사용 안 함 (0) | 2023.04.04 |
---|---|
Visual Studio Code에서 사용하는 TypeScript 버전은 무엇입니까?업데이트 방법 (0) | 2023.04.04 |
에이잭스된 콘텐츠에서 모든 (스크립트/함수) 강제 재실행 (0) | 2023.04.04 |
jQuery에서 React.js로 전환하는 방법 (0) | 2023.04.04 |
단순 ng-include가 작동하지 않음 (0) | 2023.04.04 |