如何解决Spring Boot @WebMvcTest与@SpringBootTest
@RestController
@RequestMapping("/admin")
public class AdminController {
@Value("${spring.application.name}")
String serviceName;
@GetMapping("/health")
String getHealth() {
return serviceName + " up and running";
}
}
以及要测试它的测试类:
@WebMvcTest(RedisController.class)
class AdminControllerTest {
@Autowired
private mockmvc mockmvc;
@Test
public void healthShouldReturnDefaultMessage() throws Exception {
this.mockmvc.perform(get("/admin/health"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(containsstring("live-data-service up and running")));
}
}
运行测试时,出现以下错误:
***************************
APPLICATION Failed TO START
***************************
Description:
Field configuration in com.XXXX.LiveDataServiceApplication required a bean of type 'com.XXXXX.AppConfiguration' 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 'com.XXXX.AppConfiguration' in your configuration.
在AppConfiguration.java
中定义了与主Spring Boot应用程序类相同的包:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class AppConfiguration {
@Value("${redis.host}")
private String redisHost;
@Value("${redis.port}")
private int redisPort;
@Value("${redis.password:}")
private String redisPassword;
...
// getters and setters come here
主类:
@SpringBootApplication
public class LiveDataServiceApplication {
@Autowired
private AppConfiguration configuration;
public static void main(String[] args) {
SpringApplication.run(LiveDataServiceApplication.class,args);
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration(configuration.getRedisHost(),configuration.getRedisPort());
redisConfiguration.setPassword(configuration.getRedisPassword());
return new LettuceConnectionFactory(redisConfiguration);
}
}
如果我按如下所示修改测试类中的注释,则测试通过:
@SpringBoottest
@AutoConfiguremockmvc
class AdminControllerTest {
....
我想念什么?
解决方法
您应该了解@WebMvcTest
和@SpringBootTest
的用法
@WebMvcTest:注释仅用于实例化Web层而不是整个上下文,因此应该模拟控制器类中的所有依赖关系,您可以查看documentation >
Spring Boot仅实例化Web层,而不实例化整个上下文。在具有多个控制器的应用程序中,甚至可以通过使用
来仅请求实例化一个。@WebMvcTest(HomeController.class).
我们使用@MockBean为GreetingService创建并注入一个模拟(如果您不这样做,则应用程序上下文无法启动)
SpringBootTest::Spring Boot测试注释实际加载了测试环境的应用程序上下文
,@SpringBootTest批注告诉Spring Boot查找一个主要配置类(例如,一个带有@SpringBootApplication的类),并使用该类来启动Spring应用程序上下文。
在src / test / resource / application.file中定义所有属性 将junit 5用于其余层的示例:
@ExtendWith(MockitoExtension.class)
public class RestTest {
@InjectMocks
private RestClass restClass;
private MockMvc mockMvc;
@BeforeEach
public void init() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(restClass).build();
}
@Test
public void test() throws Exception {
String url = "/url";
ResultActions resultActions = mockMvc.perform(get(url));
resultActions.andExpect(status().isOk());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。