programing

스프링 부트 유닛 모듈이 자동 배선 구성 요소를 감지하지 못하는지 테스트하십시오.

topblog 2023. 6. 22. 21:25
반응형

스프링 부트 유닛 모듈이 자동 배선 구성 요소를 감지하지 못하는지 테스트하십시오.

Maven 기반의 Spring Boot 프로젝트를 다음과 같이 두 개의 모듈로 분할했습니다.

ProjectRoot
-SharedModel
-Application
--main
---java
----com....(Application.java)
-----com....(ClassToAutowire.java)
--test
----com....(ApplicationTest.java)
-----com....(ClassToAutowireTest.java)

테스트 클래스는 다음과 같습니다.

@RunWith(SpringRunner.class)
public class ClassToAutowireTest extends BaseTest {

    @Autowired
    private ClassToAutowire classToAutowire;

    @Before
    public void setup() throws IOException {        
    ....
    }

    @Test
    public void someTest() {
        ....
        assertEquals(this.classToAutowire.isSupported(this.message), true);
    }

}

ClassToAutowire는 다음과 같습니다.

@Component
public class ClassToAutowire {

    private ConfigurationService configurationService;

    @Autowired
    public ClassToAutowire(ConfigurationService configurationService) {
        this.configurationService = configurationService;
    }



    ....

}

Application.java는 다음과 같습니다.

@SpringBootApplication
@EnableRetry
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

ApplicationTest.java는 다음과 같습니다.

@SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationTests {

    @Test
    @Ignore
    public void contextLoads() {
        // °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸
    }
}

이 유닛 테스트를 실행하면 다음 추적이 표시됩니다.

    2018-06-27 15:02:37.835 ERROR [                                main] context.TestContextManager.prepareTestInstance(TestContextManager.java:234): Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57c03d88] to prepare test instance [com.some.package.structure.ClassToAutowireTest@16aa8654]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.some.package.structure.ClassToAutowireTest': Unsatisfied dependency expressed through field 'classToAutowire'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.some.package.structure.ClassToAutowire' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:386)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.some.package.structure.ClassToAutowire' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    ... 27 more

주석을 추가하여 이 문제를 무시할 수 있습니다.@SpringBootTest(classes={ClassToAutowire.class})보다 아래에@RuneWith주석, 그러나 유닛 테스트는 테스트를 실행하기 위해 전체 SpringBoot 앱을 로드하는 것처럼 보입니다.

제 질문은 다음과 같습니다.

문제 해결을 위해 이 추가 주석이 필요한 이유는 무엇입니까?전체 Application/main/java/......(Application.java 기준)를 검색해야 하는데, 구성 요소를 탐지하지 못하는 이유는 무엇입니까?

유닛 테스트를 더 빠르게 수행하기 위해 최소 부하로 최적의 방법은 무엇입니까?

테스트를 제공합니다.@ContextConfiguration(classes = ClassToAutowire.class)그러면 컨텍스트가 해당 클래스와 함께 제공됩니다. @SpringBootTest주석은 통합 테스트에서 전체 컨텍스트를 로드하는 데 사용됩니다.와 함께@ContextConfiguration컨텍스트의 일부만 로드할 수 있는 주석입니다.

@SpringBootTest응용프로그램의 여러 계층을 통합하는 통합 테스트에 사용됩니다.이것이 전체 컨텍스트를 로드하는 이유입니다.

컨트롤러만 단위로 테스트하려면@WebMvcTest그리고 필요한 다른 모든 레이어를 조롱합니다.

작업 예제가 있는 모든 레이어의 전체 단위 테스트는 다음을 참조하십시오.봄에 하는 시험

최종검색일 : 2018/27/06

테스트 클래스를 com 패키지로 이동하여 이 오류를 해결했습니다.테스트 폴더의 구조는 다음과 같습니다.

--/test
--/--/java
--/--/--/com
--/--/--/--/TestClass

저는 이 구조가 괜찮은지는 잘 모르겠지만, 이것은 효과가 있습니다.

언급URL : https://stackoverflow.com/questions/51069050/spring-boot-unit-test-a-module-not-detecting-an-autowired-component

반응형