bestsource

유닛 테스트에서의 자동 배선 빈 덮어쓰기

bestsource 2023. 4. 4. 21:50
반응형

유닛 테스트에서의 자동 배선 빈 덮어쓰기

특정 유닛 테스트에서 자동배선 콩을 쉽게 덮어쓸 수 있는 간단한 방법이 있습니까?컴파일 클래스에는 모든 유형의 빈이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.

@TestConfigurationSpring 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>

그거widgetsServicebean은 main config xml(또는 Java config)에 정의되어 있는 bean을 덮어씁니다.inheritLocations에 대해 참조하십시오.기본 -context.xml 파일도 적어둡니다.를 들어 보겠습니다.업데이트:덧붙여야만 했다primary="true"필요한 것 같아요

언급URL : https://stackoverflow.com/questions/28605833/overriding-an-autowired-bean-in-unit-tests

반응형