JMockit 一个 Expectations 中 Mock 多个方法

从 JMockit 系列的开篇 JMockit 之 Expectations 中了解到了一个最基本的 Mock 的写法,这里记录下在一个 Expectations 中如何同时 Mock 多个方法。基本框架是这样的:


1new Expectations(MyService.class, ExternalService.class) {
2    {
3        MyService.prefix("Unmi");
4        result = "Welcome to website: ";
5
6        ExternalService.suffix("Unmi");
7        result = "http://unmi.cc";
8    }
9};

Java 语法告诉我们 new Expectations(){{......}} 省略号处的代码会在 Expectations 匿名类实例初始化时被调用,那么其中对 result 的赋值便是新创建的 Expectations 匿名类实例的 result 的属性值,那两次的 result 赋值难道不是以最后一个为准吗,有点文章了。先来跑个例子,见识一下现象,由三个类组成,分别是:

1. MyService.java
 1package cc.unmi;
 2
 3public class MyService {
 4    
 5    public static String fetchData(String name){
 6        return prefix(name) + ExternalService.suffix(name);
 7    }
 8    
 9    public static String prefix(String name){
10        throw new RuntimeException("Not implemented yet!");
11    }
12}

2. ExternalService.java
1package cc.unmi;
2
3public class ExternalService {
4
5    public static String suffix(String name) {
6        throw new RuntimeException("Not implemented yet!");
7    }
8}

3. MyServiceTest.java
 1package cc.unmi;
 2
 3import mockit.Expectations;
 4
 5import org.junit.Assert;
 6import org.junit.Test;
 7
 8public class MyServiceTest {
 9
10    @Test
11    public void testFetchData() {
12
13        new Expectations(MyService.class, ExternalService.class) {
14            {
15                MyService.prefix("Unmi");
16                result = "Welcome to website: ";
17                
18                ExternalService.suffix("Unmi");
19                result = "http://unmi.cc";
20            }
21        };
22
23        String actual = MyService.fetchData("Unmi");
24        Assert.assertEquals("Welcome to website: http://unmi.cc", actual);
25    }
26}

MyService.fetchData("Unmi") 的返回有两部分组成,MyService.prefix() 和 ExternalService.suffix()。首先告知上面的测试是成功的,说明那两个方法都被有效 Mock 掉了,他们的结果分别是被两个 result 赋值代表了。new Expectations(){{......}} 中的代码我们也无法从编译出的 MyServiceTest$ 找到痕迹,这就是 java.lang.instrument 的神通广大之处,一切尽在运行中,若要穷究底里,就得翻阅 JMockit 的源码了。 本文链接 https://yanbin.blog/jmockit-expectations-mock-multi-methods/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。