单元测试 mockito(二)

本文介绍了在SpringBoot环境中使用Mockito进行方法插桩、mock/spy对象的区别,如何使用@InjectMocks进行依赖注入,以及验证和断言的技巧,包括hamcrest库的应用和单元测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.返回指定值

2.void返回值指定插桩

3.插桩的两种方式


when(obj.someMethod()).thenXxx():其中obj可以是mock对象
doXxx().wien(obj).someMethod():其中obj可以是mock/spy对象

spy对象在没有插桩时是调用真实方法的,写在when中会导致先执行一次原方法,达不到mock的目的,
需使用doXxx().when(obj).someMethod()

4.抛异常

5.多次插桩

6.实现指定插桩逻辑

7.执行真正的原始方法

8.verify的使用


9@lnjectMocks注解的使用


●作用:若@InjectMocks声明的变量需要用到mock/spy对象,mockito会自动使用当前类里的mock或spy成员进行按类型或名字的注入
●原理:构造器注入、setter注入、字段反射注入


10. 断言工具


hamcrest:junit4中引入的第三方断言库junit5中被移出,从1.3版本后,坐标由org.hamcrest:hamcrest-core变为org.hamcrest:hamcrest
assertJ:常用的断言库
junit4原生断言
junit5原生断言

实例代码测试

要测试的方法

单元测试用例

springboot环境下配置


生成的对象受spring管理
@MockBean
●类似@Mock
●用于通过类型或名字替换spring容器中已经存在的bean,从而达到对这些bean进行mock的目的
@SpyBean
●作用类似@Spy
●用于通过类型或名字包装spring容器中已经存在的bean,当需要mock被测试类的某些方法时可以使用

<think>好的,我现在需要帮助用户了解如何在JUnit4中使用Mockito编写单元测试。用户要求示例教程和最佳实践,所以我得详细解释步骤,并提供代码示例。 首先,我需要回忆一下JUnit4和Mockito的基本知识。Mockito用于创建mock对象,模拟依赖项的行为,而JUnit4是测试框架。用户可能需要知道如何集成这两个库,以及如何编写有效的测试用例。 接下来,我应该考虑用户的引用内容。引用[5]提到Mock测试是单元测试的重要方法,用虚拟对象代替复杂对象。引用[2]和[3]展示了AssertJ和Mockito的使用示例,引用[5]还提到了Mockito与JUnit的结合。因此,我需要结合这些信息,确保回答准确。 首先,用户需要添加依赖项。在Maven项目中,通常需要JUnit4和Mockito的依赖。记得检查最新版本,比如JUnit 4.13.2和Mockito 3.12.4。可能还需要Mockito的JUnit4运行器,或者使用@RunWith(MockitoJUnitRunner.class)。 然后,步骤可能包括创建被测试类,使用@Mock注解创建mock对象,@InjectMocks注入依赖,设置mock行为,编写测试方法。需要展示如何用Mockito.when().thenReturn()来定义mock方法的行为。 最佳实践部分,应该包括使用明确的测试命名、隔离测试、验证交互、避免过度mock等。例如,测试方法名应该清晰,每个测试只关注一个功能点,验证mock对象的方法是否被调用,以及不要mock不属于自己的代码。 示例部分,可以举一个用户服务,依赖用户仓库的场景。创建UserService和UserRepository类,然后编写测试类,使用@Mock和@InjectMocks,设置findById方法返回模拟用户,并测试getUserById的正确性。 还要注意JUnit4的@Before方法,用于初始化mock,或者使用MockitoAnnotations.openMocks(this)。同时,提醒用户注意版本兼容性,以及避免过度使用mock导致测试复杂。 最后,生成相关问题,比如Mockito和JUnit5的区别,如何模拟静态方法,如何处理异常测试,或者如何验证方法调用次数。 检查是否所有步骤都覆盖了用户的需求,是否引用了正确的引用内容,比如引用[2][3][5],确保代码示例正确,使用中文回答,LaTeX格式正确,问题相关且合理。</think>### 如何在JUnit4中使用Mockito编写单元测试 以下是使用Mockito与JUnit4编写单元测试的分步指南,结合最佳实践和示例代码。 --- #### **步骤1:添加依赖** 在Maven项目的`pom.xml`中添加JUnit4和Mockito依赖: ```xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.12.4</version> <scope>test</scope> </dependency> ``` --- #### **步骤2:创建被测试类** 假设有一个`UserService`类,依赖`UserRepository`: ```java public class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public String getUserById(int id) { return userRepository.findById(id); } } ``` --- #### **步骤3:编写测试类** 1. **使用Mockito注解** 通过`@Mock`创建模拟对象,`@InjectMocks`自动注入依赖: ```java import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) // 使用Mockito运行器 public class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Test public void testGetUserById() { // 设置模拟行为 when(userRepository.findById(1)).thenReturn("Alice"); // 执行测试方法 String result = userService.getUserById(1); // 验证结果 assertEquals("Alice", result); // 验证方法调用 verify(userRepository).findById(1); } } ``` 2. **手动初始化Mock(替代运行器)** 使用`@Before`方法初始化Mock: ```java public class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Before public void setup() { MockitoAnnotations.initMocks(this); // 初始化Mock } } ``` --- #### **最佳实践** 1. **命名清晰** 测试方法名应描述测试目标,例如`testGetUserById_WhenUserExists`[^5]。 2. **隔离测试** 每个测试方法应独立,不依赖其他测试的结果[^2]。 3. **验证交互** 使用`verify()`确保依赖方法被调用,例如: ```java verify(userRepository, times(1)).findById(1); ``` 4. **避免过度Mock** 仅Mock外部依赖(如数据库、API),不Mock核心业务逻辑[^5]。 5. **结合断言库** 使用AssertJ或JUnit原生断言增强可读性: ```java import static org.junit.Assert.*; assertEquals("Alice", result); ``` --- #### **示例:模拟异常场景** ```java @Test(expected = RuntimeException.class) public void testGetUserById_ThrowsException() { when(userRepository.findById(100)).thenThrow(new RuntimeException("User not found")); userService.getUserById(100); } ``` --- #### **引用说明** - Mockito通过`when().thenReturn()`定义模拟对象的行为。 - JUnit4的`@RunWith(MockitoJUnitRunner.class)`简化了Mockito与测试类的集成[^5]。 - 使用`@InjectMocks`自动注入依赖,减少手动初始化代码[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值