Spring 使用 junit 的 @Autowired RestTemplateBuilder 引导错误
Spring Boot Error @Autowired RestTemplateBuilder with junit
尝试使用 RestTemplateBuilder 在 Spring Boot 2.1.4 中@Autowired 一个 RestTemplate。
当我 运行 junit 测试时,我在尝试自动装配 RestTemplate 时遇到错误。
我看到这里:How to autowire RestTemplate using annotations
似乎 RestTemplateBuilder 更好,所以我想使用它。
这是配置文件:
@Configuration
public class Beans {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
这是测试class:
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = Beans.class)
public class AppTest extends TestCase {
@Autowired
private RestTemplate restTemplate;
}
错误是:
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method restTemplate in beanDeclerations.Beans required a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' in your configuration.
我删除了其他有效的自动装配。
我在这里错过了什么?
在网上搜索后,我发现 spring 自动连接 RestTemplateBuilder,为什么这里不这样做?
编辑:
我最终使用了 @RestClientTest() 并且不得不暂时将 RestTemplateBuilder Bean 移动到主要的 class,稍后我将把它移动到另一个地方。
感谢您的帮助。
RestTemplateBuilder 应该可以通过自动配置获得(参见:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/client/RestTemplateAutoConfiguration.java)。我认为由于您的@ContextConfiguration 而缺少此配置。你有一些可能性。尝试将 RestTemplateBuilder 的 AutoConfig 添加到您的 ContextConfiguration。第二个是制作一个 TestConfiguration 并创建您自己的 RestTemplateBuilder 或直接创建一个 RestTemplate。第三个是不要注入 RestTemplate - 在测试中手动构建它。您也可以删除 @ContextConfiguration-Annotation 但这将导致测试加载您在项目中定义的每个配置。
还有一个专为测试设计的 RestTestTemplate (https://www.baeldung.com/spring-boot-testresttemplate)。
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = {TestConfig.class, RestTemplateAutoConfiguration.class})
public class SandboxApplicationTests {
@Autowired
RestTemplate restTemplate;
@Test
public void contextLoads() {
}
}
上面的代码片段对我有用。如果 ContextConfiguration 中没有 RestTemplateAutoConfiguration,则无法创建 RestTemplate,因为缺少 RestTemplateBuilder-Bean
我有同样的问题(在 Spring Boot 2.5.5 应用程序中)。
为了解决这个问题,我不得不在我的测试中添加 @AutoConfigureWebClient class.
所以我的测试是这样的:
@AutoConfigureWebClient
@WebMvcTest(controllers = TeamController.class)
public class TeamControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private FooService fooService;
@Test
public void findAllFoos() throws Exception {
mockMvc.perform(get("/foos"))
.andExpect(status().isOk());
}
}
但我在某处读到它可能被认为是一个错误,应该由 Spring 团队 修复(也许这个注释会直接添加到 @WebMvcTest 中?) .
我是这样认为的:测试启动和停止的速度比使用@SpringBootTest 时更快(因为最后一个使您的应用程序完全启动)。
尝试使用 RestTemplateBuilder 在 Spring Boot 2.1.4 中@Autowired 一个 RestTemplate。 当我 运行 junit 测试时,我在尝试自动装配 RestTemplate 时遇到错误。
我看到这里:How to autowire RestTemplate using annotations 似乎 RestTemplateBuilder 更好,所以我想使用它。
这是配置文件:
@Configuration
public class Beans {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
这是测试class:
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = Beans.class)
public class AppTest extends TestCase {
@Autowired
private RestTemplate restTemplate;
}
错误是:
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method restTemplate in beanDeclerations.Beans required a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' in your configuration.
我删除了其他有效的自动装配。 我在这里错过了什么? 在网上搜索后,我发现 spring 自动连接 RestTemplateBuilder,为什么这里不这样做?
编辑: 我最终使用了 @RestClientTest() 并且不得不暂时将 RestTemplateBuilder Bean 移动到主要的 class,稍后我将把它移动到另一个地方。 感谢您的帮助。
RestTemplateBuilder 应该可以通过自动配置获得(参见:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/client/RestTemplateAutoConfiguration.java)。我认为由于您的@ContextConfiguration 而缺少此配置。你有一些可能性。尝试将 RestTemplateBuilder 的 AutoConfig 添加到您的 ContextConfiguration。第二个是制作一个 TestConfiguration 并创建您自己的 RestTemplateBuilder 或直接创建一个 RestTemplate。第三个是不要注入 RestTemplate - 在测试中手动构建它。您也可以删除 @ContextConfiguration-Annotation 但这将导致测试加载您在项目中定义的每个配置。
还有一个专为测试设计的 RestTestTemplate (https://www.baeldung.com/spring-boot-testresttemplate)。
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = {TestConfig.class, RestTemplateAutoConfiguration.class})
public class SandboxApplicationTests {
@Autowired
RestTemplate restTemplate;
@Test
public void contextLoads() {
}
}
上面的代码片段对我有用。如果 ContextConfiguration 中没有 RestTemplateAutoConfiguration,则无法创建 RestTemplate,因为缺少 RestTemplateBuilder-Bean
我有同样的问题(在 Spring Boot 2.5.5 应用程序中)。
为了解决这个问题,我不得不在我的测试中添加 @AutoConfigureWebClient class.
所以我的测试是这样的:
@AutoConfigureWebClient
@WebMvcTest(controllers = TeamController.class)
public class TeamControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private FooService fooService;
@Test
public void findAllFoos() throws Exception {
mockMvc.perform(get("/foos"))
.andExpect(status().isOk());
}
}
但我在某处读到它可能被认为是一个错误,应该由 Spring 团队 修复(也许这个注释会直接添加到 @WebMvcTest 中?) .
我是这样认为的:测试启动和停止的速度比使用@SpringBootTest 时更快(因为最后一个使您的应用程序完全启动)。