我正在使用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() {
}
}
答案 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文档,则说明该批注提供了以下功能(此处未列出所有功能,而仅列出了与问题相关的内容。)
因此@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)
您还可以通过MockMvc
对其进行注释,在非@WebMvcTest
(例如SpringBootTest
)中自动配置@AutoConfigureMockMvc
。