大型软件项目,往往会在设计的时候进行模块化划分,模块之间存在依赖关系。为了减少各个模块之间的耦合,通过接口进行依赖,各个模块由不同的开发组进行并行开发。如果A模块需要使用B模块的接口,但是B模块由于开发进度缓慢,并没有完成对应实现类的开发。那么这个时候A进行单元测试就有困难了。如果A需要测试自己的模块功能,就需要将B的接口进行mock。下面介绍下jmockit如何mock接口的。
package code.c1;
public interface IStudentService {
public String getName(int id);
public int getAge(int id);
}package code.c1;
public abstract class AbstractStudentService {
public String getName(int id) {
return "ATY";
}
public abstract int getAge(int id);
}
下面是单元测试:
package net.aty.testtools.jmockit.c1;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;
import code.c1.AbstractStudentService;
import code.c1.IStudentService;
public class Run {
@Test
public void t1() {
MockUp<IStudentService> proxyStub = new MockUp<IStudentService>() {
// 需要使用@Mock标记,否则jmockit不会处理;
// 而且方法的签名必须与接口中方法签名一致,否则jmockit会报错
@Mock
public String getName(int id) {
return "00" + id;
}
};
IStudentService mockInstance = proxyStub.getMockInstance();
Assert.assertEquals("001", mockInstance.getName(1));
Assert.assertEquals(0, mockInstance.getAge(1));
proxyStub.tearDown();
}
@Test
public void t2() {
MockUp<AbstractStudentService> proxyStub = new MockUp<AbstractStudentService>() {
@Mock
public int getAge(int id) {
return 10 * id;
}
};
AbstractStudentService mockInstance = proxyStub.getMockInstance();
Assert.assertEquals("ATY", mockInstance.getName(1));
Assert.assertEquals(10, mockInstance.getAge(1));
proxyStub.tearDown();
}
}
jmockit有如下特点:
1、如果目标接口中存在多个方法,我们只需要关注需要自己mock的方法即可,对于不需要的方法,jmockit会提法默认实现,不用我们去实现接口中的所有方法。
2、MockUp中mock的方法一定要与对应接口中方法签名一致,否则会报错java.lang.IllegalArgumentException: Matching real methods not found for the following mocks。
3、MockUp中的方法一定要加@Mock注解,否则会被jmockit忽略,不能达到mock的目的。
我使用的jmockit版本如下:
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.22</version>
</dependency>
本文介绍了如何使用JMockit在大型软件项目中模拟接口和抽象类,以解决模块间依赖问题。在接口的单元测试中,JMockit允许只关注需要mock的方法,提供默认实现,避免实现所有接口方法。同时强调了MockUp中的方法必须匹配接口签名且需添加@Mock注解,否则无法正常mock。
2086

被折叠的 条评论
为什么被折叠?



