Dubbo服務提供者單元測試

前言

由於工作中使用Dubbo接口極多,在產品之間聯調時往往會出現調用超時或數據錯亂問題,此時想單獨測試調用該提供者接口時往往需要啓動整個項目,當項目較大時往往比較耗時且比較麻煩,後來發現可以直接通過API配置的方式模擬一個消費者,直接調用該接口,簡單粗暴,作爲單元測試異常好用,下面直接貼該單元測試:

public class DubboProviderTest {

    /**
     * 當前應用註冊信息
     */
    private static ApplicationConfig applicationConfig = new ApplicationConfig();
    /**
     * 註冊中心信息緩存
     */
    private static Map<String, RegistryConfig> registryConfigMap = new ConcurrentHashMap<>();
    /**
     * key值
     */
    private static String key = null;

    static {
        applicationConfig.setName("xxx.consumer");
    }

    @Test
    public void test() {
        String address = "zookeeper://10.1.62.134:2181";
        ReferenceConfig<UserServiceApi> referenceConfig = getReferenceConfig(address, null, null, UserServiceApi.class);
        if (null != referenceConfig) {
            UserServiceApi userServiceApi = referenceConfig.get();
            // 然後就是對提供者的部分方法測試..
            UserDTO userDTO = userServiceApi.get("e10adc3949ba59abbe56e057f20f88dd");
            System.out.println(userDTO.getRealname());
        }
    }

    /**
     * 獲取註冊中心信息
     * @param address 註冊中心地址
     * @param version 服務提供者版本號
     * @param group 服務所在的組
     * @return
     */
    private static RegistryConfig getRegistryConfig(String address, String version, String group) {
        key = address + "-" + version +  "-" + group;
        RegistryConfig registryConfig = registryConfigMap.get(key);
        if (null == registryConfig) {
            registryConfig = new RegistryConfig();
            registryConfig.setAddress(address);
            registryConfig.setVersion(version);
            registryConfig.setGroup(group);
            registryConfigMap.put(key, registryConfig);
        }
        return registryConfig;
    }

    /**
     * 獲取服務提供者的代理對象
     * @param address
     * @param version
     * @param group
     * @param tClass 服務提供者接口
     * @param <T>
     * @return
     */
    private static <T> ReferenceConfig<T> getReferenceConfig(String address, String version, String group, Class<T> tClass) {
        // 該實例很重,有必要可緩存,否則可能造成內存泄漏和連接泄漏
        ReferenceConfig<T> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(tClass);
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setRegistry(getRegistryConfig(address, version, group));
        referenceConfig.setVersion(version);
        return referenceConfig;
    }
}

若想同樣通過API配置的方式啓動服務提供者,可參考該Dubbo中文手冊:https://www.bookstack.cn/read/ApacheDubbo-zh/11.md

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章