一、项目概述

1.原项目github地址:https://github.com/j-easy/easy-flows.git
2.easy-flows可以用非常简易的api创建常用的可组合的工作流。涵盖了四种逻辑的处理:

easy-flows源码研习-LMLPHP

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地址: https://gitee.com/cathychen00/cathyjava-easyflows

我的文章会逐步公布到公众号,欢迎园友关注交流:
easy-flows源码研习-LMLPHP

05-18 22:48