spring boot test unable to inject TestRestTemplate and MockMvc

后端 未结 4 1748
我在风中等你
我在风中等你 2021-01-07 16:10

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.facto         


        
相关标签:
4条回答
  • 2021-01-07 16:34

    TestRestTemplate is only auto-configured when @SpringBootTest has been configured with a webEnvironment that means it starts the web container and listens for HTTP requests. For example:

    @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
    
    0 讨论(0)
  • 2021-01-07 16:50

    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.

    This is how a Test class may look like:

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
    @AutoConfigureMockMvc
    public class SBTest {
        @Autowired
        private TestRestTemplate restTemplate;
    
        @Autowired
        private MockMvc mvc;
    
       // tests
    }
    
    0 讨论(0)
  • 2021-01-07 16:50

    According to Spring boot documentation :

    You can also auto-configure MockMvc in a non-@WebMvcTest (e.g. SpringBootTest) by annotating it with @AutoConfigureMockMvc.

    0 讨论(0)
  • 2021-01-07 16:51

    To work with that, don't use a deprecated TestRestTemplate.

    Deprecated:

    import org.springframework.boot.test.TestRestTemplate;
    

    Correct:

    import org.springframework.boot.test.web.client.TestRestTemplate;
    

    Then you can use the @Autowired annotation in your class:

    @Autowired
    private TestRestTemplate restTemplate;
    

    And don't use:

    @Autowired
    private MockMvc mvc;
    

    Both together doesn't work.

    0 讨论(0)
提交回复
热议问题