Java 单元测试实践--编写方法:单元测试案例编写过程中的 Java 编程技巧 (2)
最编程
2024-04-20 16:44:52
...
/**
* 用户服务测试类
*/
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
/** 定义静态常量 */
/** 资源路径 */
private static final String RESOURCE_PATH = "testUserService/";
/** 模拟依赖对象 */
/** 用户DAO */
@Mock
private UserDAO userDAO;
/** 标识生成器 */
@Mock
private IdGenerator idGenerator;
/** 定义测试对象 */
/** 用户服务 */
@InjectMocks
private UserService userService;
/**
* 在测试之前
*/
@Before
public void beforeTest() {
Whitebox.setInternalState(userService, "canModify", Boolean.TRUE);
}
/**
* 测试: 保存用户-创建
*/
@Test
public void testSaveUserWithCreate() {
// 模拟依赖方法
// 模拟依赖方法: userDAO.getIdByName
Mockito.doReturn(null).when(userDAO).getIdByName(Mockito.anyString());
// 模拟依赖方法: idGenerator.next
Long userId = 123L;
Mockito.doReturn(userId).when(idGenerator).next();
// 调用测试方法
String path = RESOURCE_PATH + "testSaveUserWithCreate/";
String text = ResourceHelper.getResourceAsString(getClass(), path + "userSave.json");
UserSaveVO userSave = JSON.parseObject(text, UserSaveVO.class);
Assert.assertEquals("用户标识不一致", userId, userService.saveUser(userSave));
// 验证依赖方法
// 验证依赖方法: userDAO.getIdByName
Mockito.verify(userDAO).getIdByName(userSave.getName());
// 验证依赖方法: idGenerator.next
Mockito.verify(idGenerator).next();
// 验证依赖方法: userDAO.create
ArgumentCaptor<UserDO> userCreateCaptor = ArgumentCaptor.forClass(UserDO.class);
Mockito.verify(userDAO).create(userCreateCaptor.capture());
text = ResourceHelper.getResourceAsString(getClass(), path + "userCreate.json");
Assert.assertEquals("用户创建不一致", text, JSON.toJSONString(userCreateCaptor.getValue()));
// 验证依赖对象
Mockito.verifyNoMoreInteractions(userDAO, idGenerator);
}
/**
* 测试: 保存用户-修改
*/
@Test
public void testSaveUserWithModify() {
// 模拟依赖方法
// 模拟依赖方法: userDAO.getIdByName
Long userId = 123L;
Mockito.doReturn(userId).when(userDAO).getIdByName(Mockito.anyString());
// 调用测试方法
String path = RESOURCE_PATH + "testSaveUserWithModify/";
String text = ResourceHelper.getResourceAsString(getClass(), path + "userSave.json");
UserSaveVO userSave = JSON.parseObject(text, UserSaveVO.class);
Assert.assertEquals("用户标识不一致", userId, userService.saveUser(userSave));
// 验证依赖方法
// 验证依赖方法: userDAO.getIdByName
Mockito.verify(userDAO).getIdByName(userSave.getName());
// 验证依赖方法: userDAO.modify
ArgumentCaptor<UserDO> userModifyCaptor = ArgumentCaptor.forClass(UserDO.class);
Mockito.verify(userDAO).modify(userModifyCaptor.capture());
text = ResourceHelper.getResourceAsString(getClass(), path + "userModify.json");
Assert.assertEquals("用户修改不一致", text, JSON.toJSONString(userModifyCaptor.getValue()));
// 验证依赖对象
Mockito.verifyNoMoreInteractions(userDAO, idGenerator);
}
/**
* 测试: 保存用户-异常
*/
@Test
public void testSaveUserWithException() {
// 注入依赖对象
Whitebox.setInternalState(userService, "canModify", Boolean.FALSE);
// 模拟依赖方法
// 模拟依赖方法: userDAO.getIdByName
Mockito.doReturn(123L).when(userDAO).getIdByName(Mockito.anyString());
// 调用测试方法
String path = RESOURCE_PATH + "testSaveUserWithException/";
String text = ResourceHelper.getResourceAsString(getClass(), path + "userSave.json");
UserSaveVO userSave = JSON.parseObject(text, UserSaveVO.class);
UnsupportedOperationException exception = Assert.assertThrows("异常类型不一致", UnsupportedOperationException.class,
() -> userService.saveUser(userSave));
Assert.assertEquals("异常消息不一致", "不支持修改", exception.getMessage());
// 验证依赖方法
// 验证依赖方法: userDAO.getIdByName
Mockito.verify(userDAO).getIdByName(userSave.getName());
// 验证依赖对象
Mockito.verifyNoMoreInteractions(userDAO, idGenerator);
}
}
其中,加载的JSON资源文件内容如下:
userSave.json:
userCreate.json:
userModify.json:
上一篇: iOS 单元测试总结