返回顶部

收藏

java unit test Mock框架jMockit示例教程 - 访问实际被Mock的对象

更多

目标测试代码:

package cn.outofmemory.jmockit.target;  

public class Constructor {  

    private String memberId;  

    public Constructor(String memberId) {  
        this.memberId = memberId;  
    }  

    public String getRealName() {  
        return "real_" + this.memberId;  
    }  

    public String getRealInstanceName(String m) {  
        return "real_m_" + m;  
    }  

}  

Mock代码

package cn.outofmemory.jmockit.sample;  

import jmockit.target.Constructor;  
import junit.framework.Assert;  
import mockit.Mock;  
import mockit.Mockit;  

import org.junit.Test;  

/** 
 * mock实例中it代表实际的mock对象 
 *  
 * @author Ginge 
 *  
 */  
public class AccessRealInstanceTest {  
    //注意,这里少了@Mocked  
    private Constructor constructor = new Constructor("");  

    @Test  
    public void mockConstructor() {  

        // 可以在任意时候把Mock装置起来,不用的时候可以脱下来  
        Mockit.setUpMock(Constructor.class, new MockedConstructor());  

        //参数没有匹配到,直接返回了mock  
        Assert.assertEquals("mock", constructor.getRealInstanceName(""));  
        //参数匹配到real,返回了实际对象方法调用的结果  
        Assert.assertEquals("real_m_real", constructor.getRealInstanceName("real"));  

    }  

    /** 
     * MockedConstructor相当于一个标志,具体名称不重要,重要的是它里面被@Mock注解的方法。如果有方法被注解了@Mock, 
     * 并且恰好方法的签名又和Mockit.setUpMock中声明的类型中的某个方法一样,那么对应的方法就被Mock 
     * 为了方便才把这个类的声明放到ConstructorTest2里面的,其实这个类可以放到任何地方 
     *  
     * @author Ginge 
     *  
     */  
    public static class MockedConstructor {  

        //it属性表示实际对象  
        public Constructor it;  

        @Mock(reentrant = true)//reentrant表示是否可以访问实际对象  
        public String getRealInstanceName(String m) {  
            if ("real".equals(m)) {  
                return it.getRealInstanceName(m);  
            } else {  
                return "mock";  
            }  

        }  
    }  

}  

标签:jMockit,jUnit,Mock,单元测试,java

收藏

0人收藏

支持

0

反对

0