CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Java 核心深化/课时/测试与 JUnit
RawBlame
课时目录12 节

Java 核心深化

  1. 01Java 核心地图
  2. 02类型与变量
  3. 03控制流
  4. 04类与对象
  5. 05抽象与接口
  6. 06集合框架
  7. 07Lambda 与 Stream
  8. 08并发基础
  9. 09I/O 与 NIO
  10. 10构建工具
  11. 11测试与 JUnit
  12. 12综合练习

测试与 JUnit

junit、mockito、testing 节点。

30 分钟

测试与 JUnit

可靠重构依赖 自动化测试。java-fundamentals 可能已跑过 mvn test——本课用 JUnit 5 与 Mockito 写可维护的单元测试,衔接 testing-essentials。

学习目标

  • 编写 JUnit 5 测试方法与断言
  • 用 @BeforeEach、参数化测试组织用例
  • 用 Mockito mock 外部依赖

JUnit 5 基础

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

class TrackCatalogTest {

    private TrackCatalog catalog;

    @BeforeEach
    void setUp() {
        catalog = new TrackCatalog("java-core-essentials");
    }

    @Test
    void addLesson_rejectsDuplicateSlug() {
        catalog.add(new Lesson("jvc-types", "类型与变量"));
        assertThrows(IllegalArgumentException.class,
            () -> catalog.add(new Lesson("jvc-types", "重复")));
    }

    @Test
    void lessons_sortedByOrder() {
        catalog.add(new Lesson("b", "B", 2));
        catalog.add(new Lesson("a", "A", 1));
        assertEquals(List.of("a", "b"),
            catalog.lessons().stream().map(Lesson::slug).toList());
    }
}
注解作用
@Test测试方法
@BeforeEach / @AfterEach每个测试前后
@DisplayName可读测试名
@ParameterizedTest多组输入

参数化与断言

@ParameterizedTest
@ValueSource(strings = { "jvc-types", "jvc-control", "jvc-oop" })
void slug_startsWithJvc(String slug) {
    assertTrue(slug.startsWith("jvc-"));
}

优先 具体断言(assertEquals)而非只 assertTrue(a.equals(b));失败时信息更清晰。

Mockito

@ExtendWith(MockitoExtension.class)
class LessonServiceTest {

    @Mock LessonRepository repository;
    @InjectMocks LessonService service;

    @Test
    void findBySlug_delegatesToRepository() {
        when(repository.findBySlug("jvc-test")).thenReturn(Optional.of(mockLesson()));
        assertTrue(service.findBySlug("jvc-test").isPresent());
        verify(repository).findBySlug("jvc-test");
    }
}
  • mock 隔离被测类与数据库/HTTP
  • when/thenReturn 桩行为;verify 检查交互
  • 不要 mock 值对象;领域逻辑用 真实对象(见 jvc-practice)

练习

  • 为 TrackCatalog.add 写至少 3 个测试(成功、重复、null slug)
  • 用 @TempDir 测文件读写(配合 jvc-io)
  • mock 一个 Clock 或接口,测时间相关逻辑

小结

JUnit 验行为,Mockito 替依赖;测试名说清场景。 下一课综合练习:Stream + 单元测试小模块。

加载本节练习…
← 上一课构建工具下一课 →综合练习