English
在平常开发中,经常要对外部接口进行mock处理以进行测试,从而导致代码内存在大量打桩数据,降低了代码的可读性。
此包基于Javaassist字节码处理和在Spring切点进行动态代理,从而将配置文件内定义的mock数据注入代码中以分离mock流程和正常流程,增加代码可读性
<dependency>
<groupId>com.github.gungnirlaevatain</groupId>
<artifactId>mock</artifactId>
<version>1.0.0</version>
</dependency>
于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 | 当与期望值一致时,返回此处定义的结果 |
基于Spring的BeanPostProcessor扩展点,根据配置对容器内的对应的bean进行代理拦截
基于Spring的BeanPostProcessor扩展点,用动态生成的代理类实例替换准备实例化的原始bean,用于当前环境无法实例化原始bean时使用
基于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))