在开发自测,联调过程中,经常碰到一些下游服务调用不通的场景,这个时候我们如何不依赖于下游系统,就业务系统独立完成自测?
dubbo自身是支持mock服务的,在reference标签里,有一个参数mock,该参数有四个值,false,default,true,或者Mock类的类名。分别代表如下含义:
- false,不调用mock服务。
- true,当服务调用失败时,使用mock服务。
- default,当服务调用失败时,使用mock服务。
- force,强制使用Mock服务(不管服务能否调用成功)。(使用xml配置不生效,使用ReferenceConfigAPI可以生效)
例子:
实现类:
@Service public class TblEmpServiceImpl extends ServiceImpl<TblEmpMapper, TblEmp> implements TblEmpService { }
Mock类(名称必须是 接口名+Mock 的形式):
public class TblEmpServiceMock implements TblEmpService{ /** * 当消费者先去调用下游服务,发现没服务,然后调用Mock服务,返回相应数据。 */ public boolean deleteById(Serializable id) { System.out.println("恭恭敬敬"); return false; } }
消费者xml:
如果mock为true,则默认调用名称为 接口名+Mock 的类
<dubbo:reference interface="com.ssmp.service.TblEmpService" id="tblEmpService" mock="com.ssmp.controller.TblEmpServiceMock" check="false"/>
消费者:
public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/user-consumer.xml"}); context.start(); TblEmpService t = (TblEmpService) context.getBean("tblEmpService"); Boolean b = t.deleteById(1); System.out.println(b); System.in.read(); } }
输出:
恭恭敬敬
false
如果服务的消费方经常需要 try-catch 捕获异常,如:
Offer offer = null; try { offer = offerService.findOffer(offerId); } catch (RpcException e) { logger.error(e); }
请考虑改为 Mock 实现,并在 Mock 实现中 return null。如果只是想简单的忽略异常,在 2.0.11 以上版本可用:
<dubbo:reference interface="com.foo.BarService" mock="return null" />