换种思路写Mock,让单元测试更简单

开篇引入

  单元测试中的Mock方法,通常是为了绕开那些依赖外部资源或无关功能的方法调用,使得测试重点能够集中在需要验证和保障的代码逻辑上。在定义Mock方法时,开发者真正关心的只有一件事:"这个调用,在测试的时候要换成那个假的Mock方法"。

  然而当下主流的Mock框架在实现Mock功能时,需要开发者操心的事情实在太多:Mock框架如何初始化、与所用的单元测试框架是否兼容、要被Mock的方法是不是私有的、是不是静态的、被Mock对象是new出来的还是注入的、怎样把被测对象送回被测类里...这些非关键的额外工作极大分散了使用Mock工具应有的乐趣。

  换种思路写Mock,让单元测试更简单。无需初始化,不挑测试框架,甭管要换的方法是被测类的私有方法、静态方法还是其他任何类的成员方法,也甭管要换的对象是怎么创建的。写好Mock方法,加个@TestableMock注解,一切统统搞定。

  这是 README 上的描述。扫了一眼项目描述与目录结构后,就抵制不住诱惑,快速上手玩了一下。于是,就有了这篇划水博客,让看到的朋友也心痒一下(●′ω`●)。当然,最重要的是如果确实好用的话,可以在实际项目中用起来,这样就不再反感需要Mock的单元测试了。

  快速上手

  这里有一个 WeatherApi 的接口,通过调用第三方接口查询天气情况,如下:

  import com.github.itwild.less.base.http.feign.WeatherExample;

  import feign.Param;

  import feign.RequestLine;

  public interface WeatherApi {

      @RequestLine("GET /api/weather/city/{city_code}")

      WeatherExample.Response query(@Param("city_code") String cityCode);

  }

  CityWeather 查询具体城市的天气,如下:

  import cn.hutool.core.map.MapUtil;

  import com.github.itwild.less.base.http.feign.WeatherExample;

  import feign.Feign;

  import feign.jackson.JacksonDecoder;

  import feign.jackson.JacksonEncoder;

  import java.util.HashMap;

  import java.util.Map;

  public class CityWeather {

      private static final String API_URL = "http://t.weather.itboy.net";

      private static final String BEI_JING = "101010100";

      private static final String SHANG_HAI = "101020100";

      private static final String HE_FEI = "101220101";

      public static final Map<String, String> CITY_CODE = MapUtil.builder(new HashMap<String, String>())

              .put(BEI_JING, "北京市")

              .put(SHANG_HAI, "上海市")

              .put(HE_FEI, "合肥市")

              .build();

      private static WeatherApi weatherApi = Feign.builder()

              .encoder(new JacksonEncoder())

              .decoder(new JacksonDecoder())

              .target(WeatherApi.class, API_URL);

      public String queryShangHaiWeather() {

          WeatherExample.Response response = weatherApi.query(SHANG_HAI);

          return response.getCityInfo().getCity() + ": " + response.getData().getYesterday().getNotice();

      }

      private String queryHeFeiWeather() {

          WeatherExample.Response response = weatherApi.query(HE_FEI);

          return response.getCityInfo().g

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值