spring boot test无法注入TestRestTemplate和MockMvc

时间:2016-08-29 19:14:25

标签: spring-mvc spring-boot spring-test

我正在使用spring boot 1.4.0.RELEASE。我正在为我的控制器类编写测试。我得到以下异常。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.concur.cognos.authentication.service.ServiceControllerITTest': 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)}

这是我的测试类

public class ServiceControllerITTest extends ApplicationTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private MockMvc mvc;

    @Test
    public void exampleTest() throws Exception {
         // test
    }
}

ApplicationTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
//@DirtiesContext
public class ApplicationTests {

    @Autowired
    Environment env;

    @Test
    public void contextLoads() {

    }

}

4 个答案:

答案 0 :(得分:67)

TestRestTemplate仅在@SpringBootTest配置了webEnvironment时自动配置,这意味着它启动Web容器并侦听HTTP请求。例如:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)

答案 1 :(得分:5)

要使用它,请不要使用已弃用的TestRestTemplate。

推荐使用:

import org.springframework.boot.test.TestRestTemplate;

正确:

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

然后您可以在班级中使用@Autowired注释:

@Autowired
private TestRestTemplate restTemplate;

不要使用:

@Autowired
private MockMvc mvc;

两者都不起作用。

答案 2 :(得分:4)

如果您阅读SpringBootTest批注的Java文档,则说明该批注提供了以下功能(此处未列出所有功能,而仅列出了与问题相关的内容。)

  • 提供对不同webEnvironment模式的支持,包括启动在定义的或随机端口上侦听的完全运行的Web服务器的能力。
  • 注册TestRestTemplate和/或WebTestClient Bean,以用于正在使用完全运行的Web服务器侦听已定义或随机端口的Web测试中。

因此@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)提供了自动连接TestRestTemplate的功能,因为它启动了一个完全运行的Web服务器(也正如@AndyWilkinson的回答所述)。

但是,如果您也想在同一TestClass中自动连接MockMvc,请使用 通过TestClass的@AutoConfigureMockMvc注释。

这是Test类的外观:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class SBTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private MockMvc mvc;

   // tests
}

答案 3 :(得分:1)

根据Spring boot documentation

您还可以通过MockMvc对其进行注释,在非@WebMvcTest(例如SpringBootTest)中自动配置@AutoConfigureMockMvc