easy-flows源碼研習

一、項目概述

1.原項目github地址://github.com/j-easy/easy-flows.git
2.easy-flows可以用非常簡易的api創建常用的可組合的工作流。涵蓋了四種邏輯的處理:

3.可以用如下方式構造循環工作流:

RepeatFlow repeatFlow = RepeatFlow.Builder.aNewRepeatFlow()
                .named("repeatflow")
                .repeat(work)
                .until(WorkPredicate.ALWAYS_FALSE)
                .build();

二、項目亮點

由於項目代碼量小,決定手寫一下慢慢品。個人感覺,easy-flows最好玩的地方在於Builder的構造。通過在Builder模式中進一步定義接口,細化了流程中的語義和步驟哦。
拿比較簡單的順序流SequentialFlow舉例,通過ExecuteStep接口中的execute方法返回ThenStep。限制了鏈式調用過程中的then()方法在execute()之後。

public static class Builder {

        private Builder() {
            // force usage of static method aNewSequentialFlow
        }

        public static NameStep aNewSequentialFlow() {
            return new BuildSteps();
        }

        public interface NameStep extends ExecuteStep {
            ExecuteStep named(String name);
        }

        public interface ExecuteStep {
            ThenStep execute(Work initialWork);
            ThenStep execute(List<Work> initialWorkUnits);
        }

        public interface ThenStep {
            ThenStep then(Work nextWork);
            ThenStep then(List<Work> nextWorkUnits);
            SequentialFlow build();
        }

        private static class BuildSteps implements NameStep, ExecuteStep, ThenStep {

            private String name;
            private final List<Work> works;
            
            BuildSteps() {
                this.name = UUID.randomUUID().toString();
                this.works = new ArrayList<>();
            }
            
            ……

            @Override
            public SequentialFlow build() {
                return new SequentialFlow(this.name, this.works);
            }
        }

調用時如下:

SequentialFlow sequentialFlow = SequentialFlow.Builder.aNewSequentialFlow()
                .named("testFlow")
                .execute(work1)
                .then(work2)
                .then(work3)
                .build();

三、關於Mockito

1.Mockito 是一個強大的用於 Java 開發的模擬測試框架, 通過 Mockito 我們可以創建和配置 Mock 對象, 進而簡化有外部依賴的類的測試.
2.使用 Mockito 的大致流程如下:

  • 創建外部依賴的 Mock 對象, 然後將此 Mock 對象注入到測試類中.
  • 執行測試代碼.
  • 校驗測試代碼是否執行正確.

3.Mockito 會追蹤 Mock 對象的所用方法調用和調用方法時所傳遞的參數. 我們可以通過 verify() 靜態方法來來校驗指定的方法調用是否滿足斷言.

Mockito.verify(work, Mockito.times(n)).execute(workContext);

驗證execute方法是否執行了n次;

Mockito.verify(nextOnPredicateSuccess, Mockito.times(1)).execute(workContext);

驗證nextOnPredicateSuccess.execute()是否執行了1次;

Mockito.verify(nextOnPredicateFail, Mockito.never()).execute(workContext);

驗證nextOnPredicateFail是否一次都沒執行。

四、gitee地址

我的gitee地址: //gitee.com/cathychen00/cathyjava-easyflows

我的文章會逐步公布到公眾號,歡迎園友關注交流:

Tags: