如何为Java类runJob方法编写JUnit测试并自定义employee参数值?
JUnit测试中为runJob()方法的employee参数设置自定义值的实现方案
要给runJob()里的employee参数设置自定义值,核心是mock掉依赖的employeeService——因为employee的值是通过employeeService.getEmployeeNum()获取的。下面用Mockito + JUnit 5给出具体实现:
核心思路
- 用Mockito框架模拟
employeeService的行为,强制它返回你需要的自定义employee数值 - 按需模拟
performanceService的返回结果,覆盖业务中的成功/失败分支 - 调用目标方法后,验证
ScheduleJob的状态是否符合预期
具体代码实现
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; @ExtendWith(MockitoExtension.class) class DailyJobTest { // 注入被测试类实例 @InjectMocks private DailyJob dailyJob; // Mock依赖的服务对象 @Mock private EmployeeService employeeService; @Mock private PerformanceService performanceService; @Test void runJob_EmployeeHasPerformance_SetsSuccessRecord() { // 1. 设置自定义的employee数值 int customEmployeeId = 1001; when(employeeService.getEmployeeNum()).thenReturn(customEmployeeId); // 2. Mock该employee的绩效数据(非空,触发success分支) JobPerformance mockPerformance = mock(JobPerformance.class); when(mockPerformance.size()).thenReturn(2); when(performanceService.searchJobPerformance(customEmployeeId)).thenReturn(mockPerformance); // 3. 准备测试用的ScheduleJob实例 ScheduleJob testJob = new ScheduleJob(); // 4. 调用目标方法 dailyJob.runJob(testJob); // 5. 验证结果 assertEquals("success", testJob.getRecord()); } @Test void runJob_EmployeeNoPerformance_SetsFailedRecord() { // 1. 设置自定义的employee数值 int customEmployeeId = 1002; when(employeeService.getEmployeeNum()).thenReturn(customEmployeeId); // 2. Mock该employee的绩效数据(空,触发failed分支) JobPerformance mockPerformance = mock(JobPerformance.class); when(mockPerformance.size()).thenReturn(0); when(performanceService.searchJobPerformance(customEmployeeId)).thenReturn(mockPerformance); // 3. 准备测试用的ScheduleJob实例 ScheduleJob testJob = new ScheduleJob(); // 4. 调用目标方法 dailyJob.runJob(testJob); // 5. 验证结果 assertEquals("failed", testJob.getRecord()); } }
补充说明
- 若项目使用JUnit 4,只需把
@ExtendWith(MockitoExtension.class)替换为@RunWith(MockitoJUnitRunner.class) - 推荐用构造函数注入
employeeService和performanceService,@InjectMocks会自动完成依赖装配;如果是字段注入,需保证字段为包私有或public - 异常场景测试可通过
when().thenThrow()模拟服务抛出异常,验证catch块的处理逻辑
内容的提问来源于stack exchange,提问作者Bing Hao
相关产品推荐
相关产品推荐

