Mock

it2022-07-03  103

init mock //创建mock对象 config mock //设置mock期望 setup mock //将mock对象设置给被测对象 call //调用被测接口,被测接口里的代码会调用mock对象 verify //验证 拿mockito举例: User expected = new User(“admin”, “12345”); //init UserDAO dao = mock(UserDAO.class); //config when(dao.findByName(“admin”)).thenReturn(expected); //setup UserService service = new UserService(dao); //call User actual = service.login(“admin”, “12345”); //verify or assert

 

 

模拟行为)

基本上一个功能还算完善的mock server成型了。但这就够了么?对于要模拟各种场景的测试还远远不够。我们很多接口有回调的功能,我们通常还需要模拟接口超时的情况,而对于一些支付相关的接口经常需要对参数进行加密解密,而且这些情况都需要是可配置的。有没有发现,前面我们介绍的所有实际上都是mock值。也就是我们设置一些值,然后调用的时候将值返回。但是很多时候我们不仅需要mock值,更要mock行为。这样我们有了mock server中最核心的组件:命令执行引擎(好牛的名字,其实就那样)。在设置mock的时候我们不再是设置一个值,而是设置一个预定义命令组合成的流水线(即按照类似下面xml的配置一步一步执行,并且可以将上一步的执行结果传递给下一步):

<delay>1000</delay> <callback url=http://localhost/callback.do>{“ret”:”true”}</callback> <return>{“ret”:”true”}</return>

上面的流水线被命令执行引擎解析执行后就是按顺序执行对应的DelayCommand, CallbackCommand以及ReturnCommand命令了,具体命令就不介绍了。采取这种方式给我们mock server带来了很大的灵活性:只需要简单的扩展一个子命令,就可以扩充mock server的行为。比如mock某网关接口时需要使用MD5加密,只需要扩展一个MD5Command(下面代码中的$result表示前一步骤 <md 5 />加密后的结果):

<md5 /> <return>$result</return>

DSL

现在我们的mock不仅可以mock值了,对于各种行为的模拟也得心应手。但是要使用方便,还要提供便于使用的接口。Mock server提供两类接口:针对自动化测试的DSL,以及针对手工测试使用的管理界面。这里主要介绍这种DSL(因为我们的测试用例是使用xml编写,转换成编程语言也很容易):

<mock service=”http:/test.json” matcher=”hasKey($param.orderNo)”> <delay>1000</delay> <md5 /> <return>$result</result> </mock>

service是对被mock的服务的描述,比如对于SMTP,我们可以这样定义: service="smtp:9000"。这个表示在9000端口上监听smtp协议。而matcher即前面介绍的matcher组件所使用的各种匹配器,用于匹配被测系统调用mock server时传递的数据。比如上面的例子表示的就是如果被测系统调用http接口/ticket.jsp,并且参数里包含orderNo则延迟1秒钟,然后返回一个json值 。


最新回复(0)