Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot 1.4 - TestRestTemplate Unsatisfied dependency exception

Have a very light Spring Boot 1.4 project, generated from start.spring.io.

Trying to run an intergration test for @RestController with @RequestBody using TestRestTemplate, but there's no success because of a startup exception.

The only configuration class:

@SpringBootApplication
public class Application {

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

Configuration file application.properties has almost nothing except of security.ignored=/** for the test purposes.

The test class:

@RunWith(SpringRunner.class)
@SpringBootTest
@DataJpaTest
public class MyControllerTest {

    private Logger log = Logger.getLogger(getClass());

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private TestEntityManager entityManager;

    @Before
    public void init() {

        log.info("Initializing...");
    }

    @Test
    public void addTest() throws Exception {

        log.info("MyController add test starting...");

        // restTemplate usage

        log.info("MyController add test passed");
    }
}

... but during the test startup I get the following exception:

ERROR 6504 --- [           main] o.s.test.context.TestContextManager      : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.AutoConfigureReportTestExecutionListener@5444f1c3] to prepare test instance [com.myproject.controllers.MyControllerTest@5d2bc446]

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.myproject.controllers.MyControllerTest': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]

According to the doc it's not required to configure TestRestTemplate anywhere. However, I've added the latest Apache Http Client to the classpath as it recommended.

What have I missed?

like image 574
WildDev Avatar asked Aug 14 '16 19:08

WildDev


1 Answers

You are specifying @DataJpaTest which tells Spring to exclude any wiring of the web context for the tests. As such there is no TestRestTemplate created. Read this blog for more details around testing slices of your application: https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4#testing-application-slices

like image 70
Shawn Clark Avatar answered Oct 19 '22 10:10

Shawn Clark