返回顶部

收藏

java unit test Mock框架jMockit示例教程 - 另一种基于状态的Mock,随穿随脱?

更多

除了使用@MockUp的另外一种基于状态的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;  
    }  

}  

Mock代码

package cn.outofmemory.jmockit.sample;  

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

import org.junit.Test;  

/** 
 * 除了使用@MockUp的另外一种基于状态的mock测试的方式。 
 *  
 * @author Ginge 
 *  
 */  
public class ConstructorTest2 {  
    @Mocked  
    private Constructor constructor = null;  

    @Test  
    public void mockConstructor() {  

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

        // 触发构造方法的mock  
        new Constructor("Constructor");  
        Assert.assertEquals("mock_Constructor", constructor.getRealName());  

        // 注意咯,擦亮眼睛了,现在开始脱了  
        Mockit.tearDownMocks(Constructor.class);  

        constructor = new Constructor("Constructor");  
        // 看到了吧,看到真容了  
        Assert.assertEquals("real_Constructor", constructor.getRealName());  

    }  

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

        private String memberId;  

        @Mock  
        public void $init(String memberId) {  
            this.memberId = "mock_" + memberId;  
        }  

        @Mock  
        public String getRealName() {  
            return this.memberId;  
        }  
    }  

}  

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

收藏

0人收藏

支持

0

反对

0