Mockito入门疑问:generateCode方法是否需用@Mock测试?
要不要用Mockito测试你的
generateCode方法? 先直接给结论:完全不需要用Mockito,原因和具体测试方案我给你拆解清楚:
为什么不需要Mockito?
先看你的方法实现:
public String generateCode(byte[] input) { return StringUtils.join(DigestUtils.sha1Hex(input).toUpperCase()); }
这个方法是无状态的纯函数——给定相同的输入,必然返回相同的输出,而且它只依赖StringUtils、DigestUtils这类静态工具类,没有任何需要注入的Spring Bean、数据库调用、外部API等依赖项。
Mockito的核心价值是模拟那些难以直接实例化、会产生副作用(比如操作数据库)的外部依赖,而你的方法完全没有这类依赖,所以Mockito在这里派不上用场。
那怎么测试这个方法?
直接实例化RequestUtil类,写简单的单元测试验证输入输出即可,示例如下:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class RequestUtilTest { // 直接new实例,不需要@Autowired或者Mock private final RequestUtil requestUtil = new RequestUtil(); @Test void generateCode_returnsCorrectSha1UpperCase() { // 已知输入对应的SHA1大写结果 byte[] testInput = "hello-world".getBytes(); String expected = "AA010FBC1D14C795D86EF98C95479D177F4D162F"; String actual = requestUtil.generateCode(testInput); assertEquals(expected, actual); } @Test void generateCode_handlesEmptyInput() { byte[] emptyInput = new byte[0]; // SHA1空字符串的固定结果 String expected = "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"; String actual = requestUtil.generateCode(emptyInput); assertEquals(expected, actual); } }
什么时候才需要用Mockito?
如果未来你的generateCode方法引入了外部依赖,比如需要把生成的代码存入数据库,依赖了一个注入的CodeRepository:
@Autowired private CodeRepository codeRepository; public String generateCode(byte[] input) { String code = StringUtils.join(DigestUtils.sha1Hex(input).toUpperCase()); codeRepository.save(code); return code; }
这时候就需要用Mockito模拟CodeRepository,避免测试真的操作数据库:
import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.mockito.Mockito.verify; import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(MockitoExtension.class) class RequestUtilTest { // 模拟数据库依赖 @Mock private CodeRepository codeRepository; // 把Mock的依赖注入到待测试类里 @InjectMocks private RequestUtil requestUtil; @Test void generateCode_generatesAndSavesCode() { byte[] testInput = "test".getBytes(); String expectedCode = "A94A8FE5CCB19BA61C4C0873D391E987982FBBD3"; String actualCode = requestUtil.generateCode(testInput); assertEquals(expectedCode, actualCode); // 验证模拟的Repository确实被调用了save方法 verify(codeRepository).save(expectedCode); } }
总结
当前版本的generateCode方法逻辑简单、无外部依赖,直接写普通单元测试就足够;只有当方法引入了需要隔离的外部依赖时,才需要用到Mockito。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

