Java单元测试之junit4+mockito+jacoco0.8.2

Java单元测试之junit4+mockito+jacoco0.8.2

1、依赖添加

<dependency>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<version>0.8.2</version>
	<scope>test</scope>
</dependency>

<!-- 如果需要mock出某个类的静态方法 则可以加上Powermock -->
<dependency>
	<groupId>org.powermock</groupId>
	<artifactId>powermock-module-junit4</artifactId>
	<version>2.0.0-beta.5</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>org.powermock</groupId>
	<artifactId>powermock-module-mockito2</artifactId>
	<version>2.0.0-beta.5</version>
	<scope>test</scope>
</dependency>

2、创建测试类

双击需要测试的类,idea按住快捷键ctrl+shift+t,快速创建测试类,如下图:
在这里插入图片描述
在这里插入图片描述
创建出来的测试类就如下图
在这里插入图片描述
注意:测试类需要加上@RunWith注解

3、开始实践

3.1、单测的挡板

说明:当我们在单元测试的时候,不需要程序去调用数据库或者访问其他外部系统的接口时,我们可以使用到挡板。

<think>我们正在编写一个关于如何使用JUnit 4Mockito编写单元测试的指南。需要包括以下内容: 1. 环境设置(添加依赖) 2. 基本测试结构(使用JUnit 4) 3. 使用Mockito模拟对象 4. 验证行为 5. 参数匹配器 6. 异常测试 7. 注解简化(如@Mock, @InjectMocks, @RunWith等) 同时,按照要求,我们需要在行内数学表达式使用$...$,独立公式使用$$...$$(但本主题可能较少涉及数学公式,但如果有数学表达式则需遵守)。使用中文回答,并生成相关问题。 最后,生成相关问题。 注意:引用标识的添加,如果有引用,在末尾自然地添加引用标识。但这里我们可能没有具体的引用来源,所以暂时不添加,如果有必要再考虑。 现在开始编写。</think>### 如何使用 JUnit 4Mockito 编写单元测试 #### 一、环境配置 在 Maven 项目中添加依赖: ```xml <dependencies> <!-- JUnit 4 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- Mockito --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.12.4</version> <scope>test</scope> </dependency> </dependencies> ``` #### 二、基础测试结构 1. **创建测试类** 使用 `@Test` 注解标记测试方法: ```java import org.junit.Test; import static org.junit.Assert.*; public class CalculatorTest { @Test public void testAdd() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); // 验证 2+3=5 } } ``` 2. **常用断言方法** - `assertEquals(expected, actual)` - `assertTrue(condition)` - `assertNull(object)` - `assertSame(expected, actual)` #### 三、Mockito 核心功能 1. **模拟对象** 使用 `mock()` 创建模拟对象: ```java import static org.mockito.Mockito.*; @Test public void testUserService() { // 创建 UserRepository 的模拟对象 UserRepository mockRepo = mock(UserRepository.class); UserService service = new UserService(mockRepo); // 设置模拟行为 when(mockRepo.findUserById(1)).thenReturn(new User("Alice")); // 调用被测方法 User result = service.getUser(1); // 验证结果 assertEquals("Alice", result.getName()); } ``` 2. **验证交互** 检查方法是否被调用: ```java @Test public void testMethodCall() { List<String> mockList = mock(List.class); mockList.add("test"); // 验证 add("test") 被调用一次 verify(mockList, times(1)).add("test"); } ``` 3. **参数匹配器** 使用灵活的参数匹配: ```java when(mockRepo.findUserById(anyInt())).thenReturn(new User("Default")); ``` #### 四、注解简化 通过 `MockitoJUnitRunner` 自动初始化: ```java import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class OrderServiceTest { @Mock private PaymentGateway paymentGateway; // 自动创建模拟对象 @InjectMocks private OrderService orderService; // 自动注入依赖 @Test public void testProcessOrder() { when(paymentGateway.charge(anyDouble())).thenReturn(true); assertTrue(orderService.processOrder(100.0)); } } ``` #### 五、异常测试 验证是否抛出特定异常: ```java @Test(expected = IllegalArgumentException.class) public void testInvalidInput() { UserService service = new UserService(); service.getUser(-1); // 应抛出异常 } ``` #### 六、最佳实践 1. 每个测试方法只测试一个逻辑 2. 测试方法命名规范:`methodName_scenario_expectedResult` 3. 避免过度模拟,优先测试真实逻辑 > 关键点:Mockito 通过模拟依赖关系隔离被测代码,JUnit 提供测试框架支持,两者结合可构建高覆盖率的单元测试[^1]。 --- ### 相关问题 1. 如何在 JUnit 4 中测试私有方法? 2. Mockito 的 `@Spy` 和 `@Mock` 注解有什么区别? 3. 如何用 Mockito 验证方法调用的顺序? 4. JUnit 4 JUnit 5 在 Mockito 集成上有何差异? 5. 单元测试中如何处理数据库连接等外部依赖? [^1]: 基于单元测试核心原则:隔离性、自动化、快速反馈。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧阳锋feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值