You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:20:35