本地伪装

在开发自测,联调过程中,经常碰到一些下游服务调用不通的场景,这个时候我们如何不依赖于下游系统,就业务系统独立完成自测?

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" />

猜你喜欢

转载自www.cnblogs.com/yifanSJ/p/9188620.html