From 29e387426a1c6f4b13a6da73452ca17e01d105ec Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Sun, 31 May 2026 18:40:09 +0800 Subject: [PATCH] test(agent): cover skill tool container fallback and defensive paths Co-Authored-By: Claude Opus 4.8 --- .../test/agent/unit/SkillBoxFactoryTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/liteflow-testcase-el/liteflow-testcase-el-react-agent/src/test/java/com/yomahub/liteflow/test/agent/unit/SkillBoxFactoryTest.java b/liteflow-testcase-el/liteflow-testcase-el-react-agent/src/test/java/com/yomahub/liteflow/test/agent/unit/SkillBoxFactoryTest.java index 08153e00f..37269f954 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-react-agent/src/test/java/com/yomahub/liteflow/test/agent/unit/SkillBoxFactoryTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-react-agent/src/test/java/com/yomahub/liteflow/test/agent/unit/SkillBoxFactoryTest.java @@ -100,6 +100,36 @@ public class SkillBoxFactoryTest { } } + @Test + public void testToolFallsBackToReflectionWhenAbsentFromContainer() throws Exception { + StubContextAware emptyContainer = new StubContextAware(); // 不注册任何 bean + installContextAware(emptyContainer); + try { + SkillLoadResult result = SkillBoxFactory.build(new Toolkit(), cfg, List.of("tool-skill")); + + Assertions.assertEquals(List.of("tool-skill"), result.skillNames()); + // 容器中无该 bean,降级反射实例化一次 + Assertions.assertEquals(1, SkillEchoTool.CONSTRUCT_COUNT.get()); + } finally { + ContextAwareHolder.clean(); + } + } + + @Test + public void testToolFallsBackToReflectionWhenContainerAccessFails() throws Exception { + StubContextAware brokenContainer = new StubContextAware(true); // hasBean 抛异常,模拟容器未就绪 + installContextAware(brokenContainer); + try { + SkillLoadResult result = SkillBoxFactory.build(new Toolkit(), cfg, List.of("tool-skill")); + + Assertions.assertEquals(List.of("tool-skill"), result.skillNames()); + // 容器访问异常被吞掉并降级反射实例化一次 + Assertions.assertEquals(1, SkillEchoTool.CONSTRUCT_COUNT.get()); + } finally { + ContextAwareHolder.clean(); + } + } + @Test public void testEmptyAllowListLoadsAllSkills() { SkillLoadResult result = SkillBoxFactory.build(new Toolkit(), cfg, List.of());