开篇引入
单元测试中的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().getCit |