test(agent): cover skill tool container fallback and defensive paths

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
everywhere.z 2026-05-31 18:40:09 +08:00
parent e8cb271d5a
commit 29e387426a
1 changed files with 30 additions and 0 deletions

View File

@ -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());