본문 바로가기
Spring

[일지] TestRestTemplate 로 테스트 하면서 궁금했던 점(feat :NoSuchBeanDefinitionException)

by onejunu 2020. 9. 1.

테스트는 Junit5 에서 진행했고 @RunWith는 Junit5부터는 안써도 된다. 

 

처음 궁금했던 건 아래의 테스트 코드는 오류가 난다는 것이다. 이 오류는 스택오버플로우 질문에서 해결했다.

https://stackoverflow.com/questions/39213531/spring-boot-test-unable-to-inject-testresttemplate-and-mockmvc

 

spring boot test unable to inject TestRestTemplate and MockMvc

I am using spring boot 1.4.0.RELEASE. I am writing tests for my controller class. I get the following exception. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

stackoverflow.com

 

 

 

 

오류 내용은 아래와 같다.

 

Error creating bean with name '{경로}' : Unsatisfied dependency expressed through field 'restTemplate'; org.springframework.beans.factory.NoSuchBeanDefinitionException: org.springframework.boot.test.web.client.TestRestTemplate' available: expected at least 1 bean which qualifies as autowire candidate.Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)

 

 

NoSuchBeanDefinitionException

 

오류 내용을 간추리긴 했는데 요약하면 빈을 생성하지 못했다는 것이다. @Autowired의 기본설정은  required=true 이므로 빈을 찾아서 주입해야 하는데 빈을 생성할 수 없다는 것이다.

 

그리고 @SpringBootTest 어노테이션에 답이 있는데 

@SpringBootTest는 여러 환경의 웹 환경을 만들어서 테스트 할 수 있다. 그 기능으로 실제 정의된 혹은 랜덤의 포트로 웹서버를 띄울 수 있다. 또한 TestRestTemplate 를 열려있는 포트로 자동으로 등록한다.

 

즉, 열려있는 포트가 없다면 TestRestTemplate를 빈으로 등록할 수 없기 때문에 이러한 오류가 난다.

 

그래서 랜덤포트를 사용한다는 속성으로 testRestTemplate를 등록할 수 있도록 설정하면 된다.

 

 

도움 되었던 글의 원문

 

If you read the java doc of SpringBootTest annotation, it says that annotation provides below features (not listing all of them here, but only what are relevant to the question.)

  • Provides support for different webEnvironment modes, including the ability to start a fully running web server listening on a defined or random port.
  • Registers a TestRestTemplate and/or WebTestClient bean for use in web tests that are using a fully running web server listening on a defined or random port.

So @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) provides the ability to autowire TestRestTemplate because it starts a fully running web server [as mentioned in @AndyWilkinson' answer as well].

But if you want to autowire MockMvc as well in same TestClass then use @AutoConfigureMockMvc annotation over TestClass.

댓글