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());
}
}

 

posted @ 2023-09-26 22:49  你的雷哥  阅读(304)  评论(0编辑  收藏  举报