JMockit实例
package test.mock.jmockit; import static org.junit.Assert.assertEquals; import mockit.Deencapsulation; import mockit.Expectations; import mockit.Injectable; import mockit.Mock; import mockit.MockUp; import mockit.Mocked; import mockit.Tested; import org.junit.Test; public class TestJMockit { /** * mock代理dao方法 */ @Test public void result(){ //1. mock对象【mock一个dao并设置其某个方法的期望返回值】 MockUp<Dao> mockUp = new MockUp<Dao>() { @Mock public int getCount(){//设置dao里面的方法,下面的调用就会调用本方法 return 70; } }; //2. 获取mock实例 Dao dao = mockUp.getMockInstance(); Service service = new Service(); service.setDao(dao); //3. 调用 String sign = service.getCount(); System.out.println("测试结果:"+sign); assertEquals("良好", sign); //4. 还原对象,避免测试方法之间互相影响。其实对一个实例来说没什么影响,对静态方法影响较大。旧版本的tearDown()方法是Mockit类的静态方法 mockUp.tearDown();//dao为null,不可用了 // String sign2 = service.checkCount(); // System.out.println("====="+sign2); } /** * 测试方法入参直接被mock * @param dao */ @Test public void param(@Mocked final Dao dao){ new Expectations() { { dao.getCount(); result = 66; times = 1; } }; Service service = new Service(); service.setDao(dao); String sign = service.getCount(); System.out.println("测试结果:"+sign); } @Test public void privateMethod() { new Expectations(Service.class) { { Deencapsulation.invoke(Service.class, "hello");//invoke能调用私有方法 // returns(16); result = 16; // times = 1; } }; int age = Service.test(); System.out.println("测试结果:"+age); } //================================ @Tested //自动构建,无需new,自动构建和注入实例 Service serviceAI; @Injectable //自动构建并注入到@Tested实例中,并且自动会被mock Dao daoAI; /** * 自动注入:dao、service */ @Test public void autoInject(){ new Expectations() {//设置dao返回结果 { daoAI.getCount(); result = 89; } }; String sign = serviceAI.getCount(); System.out.println("测试结果:"+sign); } }
package test.mock.jmockit; public class Service { Dao dao; public static int test(){ return hello(); } public int getStudentAge(){ return getAge(); } private static int hello(){ int age = 13; System.out.println("查询学生年龄为:"+age); return age; } private static int getAge(){ int age = 13; System.out.println("查询学生年龄为:"+age); return age; } /** * 计算学生得分等级 * @return */ public String getCount(){ int count = dao.getCount(); String sign = "不及格"; if(count < 60){ System.out.println("不及格:"+count); }else if(count < 90){ System.out.println("良好:"+count); sign = "良好"; }else{ System.out.println("优秀:"+count); sign = "优秀"; } return sign; } public Dao getDao() { return dao; } public void setDao(Dao dao) { this.dao = dao; } }
package test.mock.jmockit; public interface Dao { int getCount(); int getAge(); }