美文网首页Java编程语言爱好者
代码易测性之异步代码重构

代码易测性之异步代码重构

作者: 李不言被占用了 | 来源:发表于2023-03-14 21:48 被阅读0次

这个重构技巧的核心就是不要在Runnable#run方法里写业务逻辑,将业务逻辑抽成一个单独的方法,测试起来更方便。

重构前:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import org.apache.commons.lang3.StringUtils;

public class Service {
    private BlockingQueue<String> queue = new ArrayBlockingQueue<>(128);
    
    public void start() {
        new Thread(new EventRunnable()).start();
    }

    public void doService() {
        String event = null;
        xxx;
        xxxx;
        xxxx;
        queue.offer(event);
    }

    private class EventRunnable implements Runnable {

        @Override
        public void run() {
            try {
                String event = queue.take();
                if (StringUtils.isNotBlank(event)) {
                    xxx;
                    xxxx;
                    xxx;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这段代码很好理解,Service#doService处理后将event放到队列中,然后由消费线程获取并处理EventRunnable#run

这段代码最大的问题就是可测性差,重构一下:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import org.apache.commons.lang3.StringUtils;

public class Service {
    private BlockingQueue<String> queue = new ArrayBlockingQueue<>(128);

    public void start() {
        new Thread(new EventRunnable()).start();
    }

    public void doService() {
        String event = null;
        xxx;
        xxxx;
        xxxx;
        enQueue(event);
    }

    private void enQueue(String event) {
        queue.offer(event);
    }

    private class EventRunnable implements Runnable {

        @Override
        public void run() {
            try {
                String event = queue.take();
                processEvent(event);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void processEvent(String event) {
        if (StringUtils.isNotBlank(event)) {
            xxx;
            xxxx;
            xxx;
        }
    }
}

抽出enQueueprocessEvent方法。这样只要测试processEvent就能知道逻辑是否正确,不涉及多线程。
更多的,还可以通过Mock把异步代码变成同步调用。

public void mock() {
    new MockUp<Service> () {
       @Mock
       public void start() {
           // 不用启动异步线程
       }
       
       @Mock
       public void enQueue(Invocation invocation, String event) {
           // 直接变成同步调用,串联起逻辑
           Service instance = invocation.getInvokedInstance();
           instance.processEvent(event);
       } 
    };
}

以上代码以JMockit为例,用Mockito也差不多。

相关文章

  • 一些实用的重构代码技巧

    目的 本文是来说明如何编写优秀的代码。好的代码不是一蹴而就,它需要不断重构,直到写出可读性,可测性,可拓展性的代码...

  • (14)打鸡儿教你Vue.js

    重构“代码重构” 为什么要进行重构提高代码的可读性和可维护性 代码中存在着重复的代码 存在过大的类或过长的方法 强...

  • 代码重构专题(转载)

    代码重构(一):函数重构规则代码重构(二):类重构规则代码重构(三):数据重构规则代码重构(四):条件表达式重构规...

  • 2019-03-09

    《代码之美》 《代码之殇》 《重构-改善既有代码的设计》 《程序员修炼之道 从小工到专家》

  • Java Optional 类

    改善代码可读性 重构代码,用Lambda表达式取代匿名类; 用方法引用重构Lambda表达式; 用Stream A...

  • 29 - 重构之代码可测试性

    写单元测试并不难,也不需要太多技巧,相反,写出可测试的代码反倒是件非常有挑战的事情,本文就来讲讲代码的可测试性,主...

  • 代码重构之抽象

    最近一直在重构代码,需求是这样的,要在关于session操作的时候添加缓存,这个session指的是特定的用户行为...

  • 重构代码之美

    什么是重构; 为什么要重构; 什么时候重构; 怎样避免重构的现象; 重构的难点在哪里; 如何来实施代码重构; 重构...

  • 重构改善既有的代码设计(代码的坏味道)

    坏的味道:指的是应该被修改,被重构的代码,不具有可读性,难理解,冗余代码。应该使用各种重构的手法去改变它! [TO...

  • 前端基础 (适合初学者)

    一、基础知识 1、打造高品质的前端代码,提高代码可维护性——(精简,重用,有序) (网页重构)精简代码可以让文件变...

网友评论

    本文标题:代码易测性之异步代码重构

    本文链接:https://www.haomeiwen.com/subject/xnqsnrtx.html