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()); } }
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。