2017-12-31 54 views
2

스프링 부트 1.5.9를 사용 중입니다. 다음 디렉토리 구조를 가진 간단한 스프링 - 부트 애플리케이션을 만들었습니다. Springboot junit 테스트에서 충족되지 않은 종속성 예외

enter image description here

LibraryService.java

저장소 인터페이스를 autowires하고 도서관에 책을 저장하는 방법이있다. 내가 제대로 주입되지 찾아서 나는 만족 종속 예외가 테스트 클래스에 LibraryService를 autowire하기 때

LibraryService.java 아래

@Service 
public class LibraryService { 
    private static final Logger logger = LoggerFactory.getLogger(LibraryService.class);  

    @Autowired 
    BookRepository bookRepository; 

    public void save(Book book){ 
    bookRepository.save(book); 
    } 

    public long count(){ 
    return bookRepository.count(); 
    } 
} 

는 BookRepository 인터페이스

public interface BookRepository extends MongoRepository<Book, String> { } 

입니다. LibraryServiceTest 클래스

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest 
@DataMongoTest 
public class LibraryServiceTest { 

@Autowired 
LibraryService libraryService; 

@Test 
public void testSave(){ 
Book aBook = new Book("Harry Potter" , "J. K. Rowling"); 
libraryService.save(aBook); 
assertEquals(1, libraryService.count());; 
} 
} 

입니다 다음 내가 테스트 클래스에 @MockBean 대신 @Autowired을 시도하고도 예외 없었다하지만 저장소 인스턴스가 실패 할 테스트를 결과하는 null로 평가 하였다. junit을 사용할 때 종속성을 주입하는 올바른 방법은 무엇입니까?

2017-12-31 09:48:00.112 ERROR 57648 --- [   main] 
o.s.test.context.TestContextManager  : Caught exception while allowing 
TestExecutionListener 
[org.springframework.boot.test.a[email protected]32464a14] to prepare test instance [[email protected]] 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.demo.service.LibraryServiceTest': Unsatisfied dependency expressed through field 'libraryService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.service.LibraryService' 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) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:386) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) ~[spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) ~[spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:44) ~[spring-boot-test-autoconfigure-1.5.9.RELEASE.jar:1.5.9.RELEASE] 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) ~[spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12] 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12] 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12] 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12] 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12] 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12] 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) [spring-test-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:na] 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:na] 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:na] 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) [.cp/:na] 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:na] 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:na] 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.service.LibraryService' 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) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE] 
... 29 common frames omitted 
+0

예외에 대해 질문 할 때는 항상 정확한 예외 스택 추적을 게시하십시오. DAO를 조롱하여 서비스를 테스트해야합니다. 이것이 기본적으로 DI가 유용한 첫 번째 이유입니다. –

+0

@JBNizet 안녕하세요, 스택 추적을 추가했습니다. – BlueStar

답변

1

the documentation에서 : 전형적인 MongoDB를 시험에 @RunWith(SpringRunner.class)와 함께 사용할 수 있습니다

주석에 이어

편집

스택 추적입니다. 테스트가 만을 MongoDB 구성 요소에 집중할 때 사용할 수 있습니다.

이 주석을 사용하면 완전 자동 구성이 비활성화되고 대신 MongoDB 테스트와 관련된 구성 만 적용됩니다.

따라서 스프링 컨텍스트에서 서비스가 제외됩니다 (어쨌든 @RunWith(SpringRunner.class)으로 주석되어야 함).

Mongo 리포지토리를 테스트 할 때 사용하십시오. 서비스를 테스트하려면 저장소를 모방합니다 (이것이 DI가 처음부터 유용한 이유입니다). 그리고 조롱 된 저장소에서 서비스 내부의 비즈니스 로직을 테스트합니다.

+0

고맙습니다. 나는'@ DataMongoTest' 주석을 제거하고 그 트릭을했습니다. – BlueStar

관련 문제