其他
史上最轻量!阿里新型单元测试Mock工具开源了
阿里妹导读:为了探索更轻量易用的Mock测试手段,阿里云云效团队尝试给工具减负,在主流Mock工具的基础上让Mock的定义和置换干净利落,最终设计了一款极简风格的测试辅助工具TestableMock,无需初始化,不挑测试框架,无论要换的是私有方法、静态方法、构造方法还是其他任何类的任何方法,也无需关注要换的对象是怎么创建的,只要写好Mock定义,加个@MockMethod注解,就能统统搞定。本文分享TestableMock的实现原理。
文末福利:史上最全阿里工程师实践精华电子书下载。
“你,在测试的时候,换成这个假的调用!”
// 第一步:初始化
Mockito@RunWith(MockitoJUnitRunner.class)
public class RecordServiceTest {
// 第二步:定义Mock对象
@Mock
DatabaseDAO databaseMock;
// 第三步:定义测试用例
@Test
public void saveTest()
{
// 第四步:定义替代方法
when(databaseMock.write()).thenReturn(4);
// 第五步:注入Mock对象
RecordService recordService =
new RecordService(databaseMock);
// 第六步:执行测试内容
boolean saved = recordService.save("demo");
// 第七步:验证测试结果
assertEquals(true, saved);
// 第八步:验证Mock方法被执行
verify(databaseMock, times(1)).write();
}
}
// 第一步:初始化JMockit
@RunWith(JMockit.class)
public class PerformerTest {
// 第二步:定义Mock对象
@Mocked
private Collaborator collaborator;
// 第三步:定义被测对象
// 隐含注入Mock对象逻辑
@Tested
private Performer performer;
// 第四步:定义测试用例
@Test
public void testThePerformMethod() {
// 第五步:定义替代方法
new Expectations() {{
collaborator.work("bar"); result = 10;
}};
// 第六步:执行测试内容
boolean res = performer.perform("test");
// 第七步:验证测试结果
assertEquals(true, res);
// 第八步:验证Mock方法被执行
new Verifications() {{
collaborator.receive(true);
}};
}
}
public class RecordServiceTest
{
// 定义Mock目标和替代方法
// 约定Mock方法比原方法多一个参数,传入调用者本身
// 因此是替换DatabaseDAO类的int write()方法调用
@MockMethod
int write(DatabaseDAO origin) { return 4; }
// 定义测试用例
@Test
public void saveTest() {
// 执行测试内容
RecordService rs = new RecordService();
boolean saved = rs.save("demo");
// 验证测试结果
assertEquals(true, saved);
// 验证Mock方法被执行
TestableTool.verify("write").times(1);
}
}
假设一:同一个测试类里,一个测试用例里需要Mock掉的方法,在其他测试用例里通常也都需要Mock。因为这些被Mock的方法往往访问了不便于测试的外部依赖。
假设二:需要Mock的调用都来自被测类的代码。此假设是符合单元测试初衷的,即单元测试只应该关注当前单元的内部行为,单元外的逻辑应该被替换为Mock。
@MockMethod
int write(DatabaseDAO origin) {
switch(TestableTool.SOURCE_METHOD) {
case "save": return 10;
default: return origin.write();
}
}
动态代理:Mockito、EasyMock、MockRunner
自定义类加载器:PowerMock
运行时字节码修改:JMockit、TestableMock
功能比PowerMock毫不逊色,用法比Mockito更加简洁,不挑框架,指哪换哪,一个@MockMethod注解打天下。
作为应用最广、使用频率最高的编程语言,Java在互联网行业举足轻重。本次整理了7本Java相关电子书,涵盖Java开发手册及解读、必备基础知识以及Spring Cloud Alibaba实战,分享阿里工程师在Java上的实践精华。
点击“阅读原文”,快去下载吧~