JMockit学习笔记
1 基本概念
1.1 常用注解
@Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中)
@Injectable:仅Mock被修饰的对象
@Capturing:可以mock接口以及其所有的实现类
@Mock:MockUp模式中,指定被Fake的方法
1.2 常用的类
- Expectations:期望,指定的方法必须被调用
- StrictExpectations:严格的期望,指定方法必须按照顺序调用
- NonStrictExpectations:非严格的期望,是否调用和顺序不作要求
- Verifications:验证,一般配合NonStrictExpectations来使用
- Invocation:工具类,可以获取调用信息
- Delegate:自己指定返回值,适合那种需要参数决定返回值的场景,只需指定匿名子类就可以。
- MockUp:模拟函数实现
- Deencapsulation:反射工具类
2 使用实例
现有两个类如下:
SimpleTool.java:
public class SimpleTool { public String fun1(String str) { return "real: public String fun1(" + str + ")"; } private String fun2(String str) { return "real: private String fun2(" + str + ")"; } public String fun3(String str) { return "real: public String fun3(" + str + ")"; } public String fun4(String str) { return fun2(str); } }
UseSimpleTool.java:
public class UseSimpleTool { public String fun1(String name) { SimpleTool simpleTool = new SimpleTool(); return simpleTool.fun1(name); } }
2.1 Status-based
2.1.1 实例1:Mocked
@Mocked SimpleTool simpleTool; @Test public void testExpectation() { //未mock函数返回null new Expectations() { { simpleTool.fun1(anyString); result = "MOCK"; } }; System.out.println(simpleTool.fun1("param")); System.out.println(simpleTool.fun3("param")); System.out.println(new UseSimpleTool().fun1("param")); new Verifications() { { simpleTool.fun1(anyString); times = 2; } }; }
@Autowired和@Tested 和@Injected和@Mocked的区别。
首先Autowired用来注入springboot实例bean,
后三者则是通过mock对象,用在单元测试中。
@Tested和@Injectable的区别
@Injected和@Mocked的区别
/** * @author: xinruoxiangyang9010 * 测试案例 */ @RunWith(JMockit.class) public class MockAndInjectTest { @Test public void testMock(@Mocked DiffServiceImpl diffService) { new Expectations() { { diffService.method(); result = "mockMethod"; } }; assertEquals("mockMethod", diffService.method()); // @Mocked修饰的变量,即便是再new出来的,也会按照上面我们mock的结果返回 assertEquals("mockMethod", new DiffServiceImpl().method()); } @Test public void testInjectable (@Injectable DiffServiceImpl diffService) { new Expectations() { { diffService.method(); result = "mockMethod"; } }; assertEquals("mockMethod", diffService.method()); // 注意这里结果的不同, 在对@Injectable修饰的对象进行Expectations指定结果时 // 受影响的只是被修饰的对象,如果我们new一个示例出来,是不会受Expectations影响的 assertEquals("real", new DiffServiceImpl().method()); } }
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2020-09-26 crf进行词性标记详解
2020-09-26 词性标注的简单综述
2020-09-26 隐马尔科夫模型HMM