스프링 부트 유닛 모듈이 자동 배선 구성 요소를 감지하지 못하는지 테스트하십시오.
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
'programing' 카테고리의 다른 글
mongo 셸에서 문서 필드를 보는 방법은 무엇입니까? (0) | 2023.06.22 |
---|---|
'에 의해 하나의 '문서'를 제거하는 방법MongoDB의 공식 C# 드라이버를 사용하는 ID? (0) | 2023.06.22 |
git branch -r을 실행할 때 "origin/HEAD"가 표시되는 이유는 무엇입니까? (0) | 2023.06.22 |
Oracle Floats 대 (0) | 2023.06.22 |
git merge: 다른 파일로 이동한 코드에 변경 사항 적용 (0) | 2023.06.22 |