模拟接口,能够在真实接口或是任何方法上生成对应的模拟接口,不触发业务逻辑而直接返回模拟值。
适合以下场景:
- 产品DEMO,需要大量随机数据,并会随时更新。
- 临时接口,用于做联通测试与数据格式对齐。
- 接口文档生成,直接提供入参与出参格式及格式样例数据,更加直观。
特点:
- 使用方便,使用注解的侵入方式,或是使用非侵入的手动注入方式来生成虚拟接口。
- 动态结构,生成的数据随着原始方法的更新而自动更新,不需要手动维护。
- 学习成本低,模拟接口被注入到
RequestMappingHandlerMapping中,允许开发者按照默认的方式管理生成的模拟接口,而不需要学习新的规范规则。
以下内容基于3.x版本,以前版本请移步2.x介绍。
例如你有一个这样的接口方法:
@GetMapping
public BaseResult<User> getById(int id) {
return null;
}在访问时因为没有实际业务代码,只会返回null,而使用MockApi则会返回如下内容:
这里使用了mockapi-mock组件
相比较与一般的数据构造器,MockApi是自适应的,当接口返回值发生变化时不需要开发者进行任何调整,模拟接口会自动返回对应结构数据,几乎实现一劳永逸。
侵入式的方式最为简单,只需要新建一个MyObjectMocker类去实现ObjectMocker:
public class MyObjectMocker implements ObjectMocker {
@Override
public Object mock(MockItem item, RequestPack pack) {
// 我们根据请求目标方法的返回值生成对应的对象,并返回实例
Class<?> returnType = pack.getOldMethod().getReturnType();
try {
return returnType.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}随后就可以在MockApi接口中通过mocker参数使用它了:
@RestController("user")
public class UserController {
@MockApi(mocker = MyObjectMocker.class)
@GetMapping
public User getById(String id) {
return null;
}
@GetMapping("batch")
public List<User> add(User user) {
return new ArrayList<>();
}
}此时我们访问/mock就会返回一个User实例而不是null。
非侵入式需要用到PathRecorder,这是需要构造虚拟地址的记录,只需要向其中add方法即可由MockApi生成对于的虚拟接口。
例如:
@Component
@AutoConfigureBefore(MockApiRegister.class)
public class OtherRecorder {
@Autowired
private PathRecorder pathRecorder;
@PostConstruct
public void init() {
pathRecorder.add(PathRecorder.Path.generate(Test.class));
}
interface Test {
int i();
}
}这里注意要在MockApiRegister注册前进行添加。
这样就可以通过/mock/test/i来访问对Test接口生成的i虚拟方法了。
请移步开发文档
已经定义好@MocKResult和@MockParams的 mockapi-mock。
自动填充接口入参的 mockapi-arg。
目前的版本基于SpringBoot-2.7.18版本开发
-
添加依赖
添加Jitpack仓库,这里不做赘述。
-
添加依赖
<dependency> <groupId>com.github.verlif.mockapi</groupId> <artifactId>mockapi-core</artifactId> <!--<artifactId>mockapi-mock</artifactId>--> <version>${last-version}</version> </dependency>
-
在需要mock的controller类上或是接口方法上添加
@MockApi注解注解采用就近原则的方式生效。
完成
