package com.atheima;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.result.StatusResultMatchers;
@SpringBootTest(args = {"--test.prop=123"},webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
class Springboot13ConfigurationApplicationTests {
@Value("${test.prop}")
private String msg;
@Test
void contextLoads() {
System.out.println(msg);
}
@Test
void testWeb(@Autowired MockMvc mockMvc){
RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/books");
try {
ResultActions perform = mockMvc.perform(requestBuilder);
StatusResultMatchers status = MockMvcResultMatchers.status();
ResultMatcher ok = status.isOk();
perform.andExpect(ok);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- @AutoConfigureMockMvc注解则是一个测试自动配置注解,它会自动配置MockMvc实例。MockMvc是一个强大的工具,允许你以编程方式模拟 HTTP 请求并验证响应,而无需启动实际的 Servlet 容器。
- @SpringBootTest注解用于加载整个 Spring 应用程序上下文,包括你的应用程序配置和所有 Bean。
- 使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)时,并不要求你必须和@AutoConfigureMockMvc一起启用。这两个注解服务于不同的目的,并且它们的使用是独立的。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)告诉Spring Boot启动一个完整的Servlet容器,并监听一个预定义的端口(通常是由server.port属性指定的)。这意味着你的测试将能够通过网络层与运行中的Spring Boot应用程序进行交互,就像它是一个真正的Web应用程序一样。
然而,这种测试方式通常更重,因为它需要启动整个Servlet容器,并且可能需要处理网络延迟和并发问题。此外,由于它监听一个端口,因此不能在同一端口上同时运行多个这样的测试实例。
另一方面,@AutoConfigureMockMvc用于自动配置MockMvc,这是一个用于测试Spring MVC控制器的强大工具。它允许你以编程方式模拟HTTP请求并验证响应,而无需启动实际的Servlet容器或监听网络端口。
如果你需要测试整个应用程序的集成(包括网络层),并且不介意测试运行得更慢,那么你可以使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT),但通常你不会与@AutoConfigureMockMvc一起使用它,因为MockMvc是用于模拟HTTP请求的,而不是与真实运行的Servlet容器进行交互。
- 请注意,即使你使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT),你仍然可以通过其他方式(如使用RestTemplate、WebClient或HttpClient等)来发送HTTP请求到你的Spring Boot应用程序,并验证响应。但是,这些方法不如MockMvc那样轻量级或方便,因为它们涉及到网络层的交互。