# mock
**Repository Path**: GungnirLaevatain/mock
## Basic Information
- **Project Name**: mock
- **Description**: 基于配置,对指定的类方法进行mock处理
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-10-29
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MOCK
[**English**](https://github.com/GungnirLaevatain/mock/blob/master/README.md)
在平常开发中,经常要对外部接口进行mock处理以进行测试,从而导致代码内存在大量打桩数据,降低了代码的可读性。
此包基于Javaassist字节码处理和在Spring切点进行动态代理,从而将配置文件内定义的mock数据注入代码中以分离mock流程和正常流程,增加代码可读性
## Getting Started
### Maven依赖
```xml
com.github.gungnirlaevatain
mock
1.0.0
```
### 新建配置文件
于classpath下新建mock文件夹,并于此文件夹中新建yml格式的文本文件,例如class.yml等
### 添加配置项
于文本文件内填入配置项
### 运行
启动项目
## 配置说明
### 例子
```
entities:
# 指定使用的mock模式
- type: BEAN_REPLACE
# 指定mock的目标类
className: com.github.gungnirlaevatain.mock.sample.replace.ReplaceTestServiceImpl
# 指定需要mock的方法
methods:
# 需要mock的目标方法
- method: testReturnObjectByDefault
# 默认返回值,对象类型则为json字符串
defaultResult: '{"a":"AAA","b":3,"c":"2019-07-23 00:32:00","d":{"a":"BBB"}}'
- method: testReturnObjectByParam
# 设定不同条件下的返回值
results:
# 所取的入参,基于JsonPath的语法,根节点为入参组成的数组
- path: $.0
# 该入参的期望值
expected: 1
# 当所取的入参值等同于期望值时,返回定义的结果
result: '{"a":"AAA"}'
- path: $.1
expected: 'B'
result: '{"a":"BBB"}'
- path: $.2.a
expected: 'CCC'
result: '{"a":"CCC"}'
- method: testVoid
defaultResult: '{"a":"AAA","b":3,"c":"2019-07-23 00:32:00","d":{"a":"BBB"}}'
- method: testReturnString
defaultResult: 'true'
- method: testReturnInt
defaultResult: '1'
- method: testReturnInt
# 若存在重载,则需要指定入参的类型
paramClass:
- java.lang.String
defaultResult: 2
- method: testReturnInt
paramClass:
- java.lang.String
- com.github.gungnirlaevatain.mock.sample.TestResult
defaultResult: "3"
```
### 配置项说明
| 键名 | 数据结构 | 默认值 | 说明 |
| entities | List | null | 配置文件的起始键名 |
| ├─type | String | BEAN_PROXY | 采用的mock方式,分为BEAN_PROXY,BEAN_REPLACE,CLASS三种方式 |
| ├─className | String | null | mock的目标类名 |
| ├─methods | List | null | mock的目标类中的方法列表 |
| ├─method | String | null | mock的目标类中的方法名称 |
| ├─defaultResult | String | null | 默认的返回值,若为对象,则为json格式的字符串 |
| ├─paramClass | List | null | 方法的入参参数的类名称集合,次序和入参顺序一致 |
| ├─results | List | null | 定义的结果返回规则 |
| ├─path | String | null | 对入参集合(args[])进行取值的基于JsonPath规则的路径信息 |
| ├─expected | String | null | 期望值 |
| ├─result | String | null | 当与期望值一致时,返回此处定义的结果 |
### Mock方式说明
#### 1.BEAN_PROXY方式
基于Spring的BeanPostProcessor扩展点,根据配置对容器内的对应的bean进行代理拦截
#### 2.BEAN_REPLACE方式
基于Spring的BeanPostProcessor扩展点,用动态生成的代理类实例替换准备实例化的原始bean,用于当前环境无法实例化原始bean时使用
#### 3.CLASS方式
基于Javaassist的字节码处理技术,对非容器管理的类进行基于字节码的修改
## 样例代码
### 例子
- 编写原始类
```
@Service
@Slf4j
public class ProxyTestServiceImpl implements ProxyTestService {
/**
* Test return object by default.
* 测试返回默认值
*
* @return the proxy test result
* @author GungnirLaevatain
*/
@Override
public TestResult testReturnObjectByDefault() {
return null;
}
}
@Data
public class TestResult {
private String a;
private Integer b;
private Date c;
private TestResult d;
}
```
- 配置定义
```
entities:
- type: BEAN_PROXY
className: com.github.gungnirlaevatain.mock.sample.proxy.ProxyTestService
methods:
- method: testReturnObjectByDefault
defaultResult: '{"a":"AAA","b":3,"c":"2019-07-23 00:32:00","d":{"a":"BBB"}}'
```
- 编写测试类
```
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MockSampleApplication.class)
public class BeanProxyTest {
@Autowired
private ProxyTestService proxyTestService;
/**
* Method: testReturnObjectByDefault()
*/
@Test
public void testTestReturnObjectByDefault() throws Exception {
TestResult testResult = proxyTestService.testReturnObjectByDefault();
Assert.assertEquals("AAA", testResult.getA());
Assert.assertNotNull(testResult.getC());
Assert.assertNotNull(testResult.getD());
Assert.assertEquals(0, 3 - testResult.getB());
Assert.assertEquals("BBB", testResult.getD().getA());
System.out.println(testResult);
}
}
```
- 输出信息如下
```
TestResult(a=AAA, b=3, c=Tue Jul 23 00:32:00 CST 2019, d=TestResult(a=BBB, b=null, c=null, d=null))
```
### 详细信息
[请见mock-sample模块](https://github.com/GungnirLaevatain/mock/tree/master/mock-sample)