diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringTest.java
new file mode 100644
index 000000000..0fbfb81fc
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringTest.java
@@ -0,0 +1,45 @@
+package com.yomahub.liteflow.test.abstractChain;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import javax.annotation.Resource;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration("classpath:/abstractChain/application-json.xml")
+public class AbstractChainJsonELSpringTest extends BaseTest {
+
+ @Resource
+ private FlowExecutor flowExecutor;
+
+ // 是否按照流程定义配置执行
+ @Test
+ public void test1() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implA", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>c==>d==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test2() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implB", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test3() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implC", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>a==>b", response.getExecuteStepStrWithoutTime());
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringTest.java
new file mode 100644
index 000000000..b07b2c0ec
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringTest.java
@@ -0,0 +1,46 @@
+package com.yomahub.liteflow.test.abstractChain;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import javax.annotation.Resource;
+
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration("classpath:/abstractChain/application-xml.xml")
+public class AbstractChainXMLELSpringTest extends BaseTest {
+
+ @Resource
+ private FlowExecutor flowExecutor;
+
+ // 是否按照流程定义配置执行
+ @Test
+ public void test1() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implA", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>c==>d==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test2() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implB", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test3() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implC", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>a==>b", response.getExecuteStepStrWithoutTime());
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYMLELSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYMLELSpringTest.java
new file mode 100644
index 000000000..adff8b938
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYMLELSpringTest.java
@@ -0,0 +1,46 @@
+package com.yomahub.liteflow.test.abstractChain;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import javax.annotation.Resource;
+
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration("classpath:/abstractChain/application-yml.xml")
+public class AbstractChainYMLELSpringTest extends BaseTest {
+
+ @Resource
+ private FlowExecutor flowExecutor;
+
+ // 是否按照流程定义配置执行
+ @Test
+ public void test1() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implA", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>c==>d==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test2() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implB", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>j", response.getExecuteStepStrWithoutTime());
+ }
+
+ //测试嵌套继承的baseChain是否重复解析
+ @Test
+ public void test3() throws Exception {
+ LiteflowResponse response = flowExecutor.execute2Resp("implC", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("a==>b==>a==>b==>a==>b==>f==>a==>b", response.getExecuteStepStrWithoutTime());
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ACmp.java
new file mode 100644
index 000000000..8aaf2caae
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ACmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("a")
+public class ACmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("ACmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/BCmp.java
new file mode 100644
index 000000000..2f336f6ab
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/BCmp.java
@@ -0,0 +1,16 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+
+@Component("b")
+public class BCmp extends NodeComponent {
+
+
+ @Override
+ public void process() {
+ System.out.println("BCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java
new file mode 100644
index 000000000..e2c16b4ae
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java
@@ -0,0 +1,15 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeIfComponent;
+import org.springframework.stereotype.Component;
+
+
+@Component("c")
+public class CCmp extends NodeIfComponent {
+ @Override
+ public boolean processIf() throws Exception {
+ //do your biz
+ return true;
+ }
+}
+
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/DCmp.java
new file mode 100644
index 000000000..4f5f5b7ec
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/DCmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("d")
+public class DCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("DCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ECmp.java
new file mode 100644
index 000000000..0a597dde2
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/ECmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("e")
+public class ECmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("ECmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/FSwitchCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/FSwitchCmp.java
new file mode 100644
index 000000000..34b09c70a
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/FSwitchCmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeSwitchComponent;
+import org.springframework.stereotype.Component;
+
+@Component("f")
+public class FSwitchCmp extends NodeSwitchComponent {
+
+ @Override
+ public String processSwitch() throws Exception {
+ return "j";
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/JCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/JCmp.java
new file mode 100644
index 000000000..a10829874
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/JCmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("j")
+public class JCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("JCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/KCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/KCmp.java
new file mode 100644
index 000000000..f15e2963a
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/KCmp.java
@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.abstractChain.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("k")
+public class KCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("KCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-json.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-json.xml
new file mode 100644
index 000000000..0ee724ca6
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-json.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-xml.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-xml.xml
new file mode 100644
index 000000000..4aa6af206
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-xml.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-yml.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-yml.xml
new file mode 100644
index 000000000..80f2f6ebb
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/application-yml.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.json b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.json
new file mode 100644
index 000000000..453bda2d9
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.json
@@ -0,0 +1,32 @@
+{
+ "flow": {
+ "chain": [
+ {
+ "id": "implB",
+ "extends": "base2",
+ "value": "{3}=THEN(a,b);\n {4}=j;"
+ },
+ {
+ "id": "implC",
+ "extends": "base2",
+ "value": "{3}=THEN(a,b);\n {4}=THEN(a,b).id(\"j\");"
+ },
+ {
+ "id": "base",
+ "abstract": true,
+ "value": "THEN(a, b, {0}, {1});"
+ },
+ {
+ "id": "implA",
+ "extends": "base",
+ "value": "{0}=IF(c, d, e);\n {1}=SWITCH(f).to(j,k);"
+ },
+ {
+ "id": "base2",
+ "extends": "base",
+ "abstract": true,
+ "value": "{0}=THEN(a,b,{3});\n {1}=SWITCH(f).to({4},k);"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.xml
new file mode 100644
index 000000000..1994b64c5
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.xml
@@ -0,0 +1,28 @@
+
+
+
+ {3}=THEN(a,b);
+ {4}=j;
+
+
+
+ {3}=THEN(a,b);
+ {4}=THEN(a,b).id("j");
+
+
+
+ THEN(a, b, {0}, {1})
+
+
+
+ {0}=IF(c, d, e);
+ {1}=SWITCH(f).to(j,k);
+
+
+
+ {0}=THEN(a,b,{3});
+ {1}=SWITCH(f).to({4},k);
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.yml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.yml
new file mode 100644
index 000000000..b79e458fe
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/abstractChain/flow.el.yml
@@ -0,0 +1,18 @@
+flow:
+ chain:
+ - id: implB
+ extends: base2
+ value: "{3}=THEN(a,b);\n {4}=j;"
+ - id: implC
+ extends: base2
+ value: "{3}=THEN(a,b);\n {4}=THEN(a,b).id(\"j\");"
+ - id: base
+ abstract: true
+ value: "THEN(a, b, {0}, {1});"
+ - id: implA
+ extends: base
+ value: "{0}=IF(c, d, e);\n {1}=SWITCH(f).to(j,k);"
+ - id: base2
+ extends: base
+ abstract: true
+ value: "{0}=THEN(a,b,{3});\n {1}=SWITCH(f).to({4},k);"