学习目标与前置
建议用时:60-90 分钟准备:Spring Boot + Todo 接口
- 配置 Slf4j + Logback。
- 编写 MockMvc/JUnit 测试覆盖核心接口。
- 打包并以内嵌/外置 Tomcat 运行。
Step 1:日志配置
private static final Logger log = LoggerFactory.getLogger(TodoService.class);
public Todo create(Todo t) {
log.info("create todo title={}", t.getTitle());
mapper.insert(t);
return t;
}
<!-- src/main/resources/logback-spring.xml -->
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
说明:INFO 级别输出基础日志;可按需增加文件输出。
Step 2:MockMvc/JUnit 测试
flowchart LR A[MockMvc 调用 Controller] --> B[业务处理] B --> C[返回响应] C --> D[断言状态码/内容] D --> E[测试报告]
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
@SpringBootTest
@AutoConfigureMockMvc
class TodoControllerTest {
@Autowired MockMvc mvc;
@Test
void createAndList() throws Exception {
mvc.perform(post("/api/todos")
.contentType("application/json")
.content("{\"title\":\"demo\",\"done\":false}"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("demo")));
mvc.perform(get("/api/todos"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("demo")));
}
}
说明:@SpringBootTest 启动上下文;@AutoConfigureMockMvc 注入 MockMvc;断言状态码与响应体。
Step 3:打包与运行
flowchart LR A[mvn clean package] --> B[JAR] B --> C[内嵌启动 java -jar] A --> D[WAR (skipTests)] D --> E[部署到外置 Tomcat]
mvn clean package
# 内嵌运行
java -jar target/demo-0.0.1-SNAPSHOT.jar
# 外置 Tomcat(打 war)
mvn clean package -DskipTests
# 将 demo-0.0.1-SNAPSHOT.war 放入 Tomcat webapps
# 启动 Tomcat,访问 http://localhost:8080/demo
说明:Jar 适合快速运行;War 可部署在集中 Tomcat。课堂可各演示一次。
Step 4:操作与验证
- 运行
mvn test,查看通过结果。 - 故意改接口返回值让测试失败,再修复,演示回归。
- 打包 jar 运行;再打包 war 放 Tomcat,对比访问路径。
常见问题与排查
- 测试找不到接口:检查 Controller 路径、启动端口、上下文加载是否成功。
- war 部署 404:确认访问路径包含上下文(如 /demo/api/...)。
- 日志过多:调整 root level 或针对包设置日志级别。
课堂练习
- 为删除接口补充失败用例(未登录或未找到)。
- 在日志中加入 traceId(UUID)打印,请求进入/退出都带上。
课后巩固
- 写一份 README:启动命令、配置项、默认账号、常见问题。
- 补充一个集成测试:创建-查询-删除 的完整流程。