From a9feec322b668884e5f7db2764610d70f0bd289b Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Thu, 30 Oct 2025 11:15:55 +0800 Subject: [PATCH] Add test to ensure that ToolCallbackResolver doesn't use MCP ToolCallbackProviders See GH-4751 Signed-off-by: Yanming Zhou --- .../pom.xml | 7 ++++ .../ToolCallingAutoConfigurationTests.java | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml index 5377bed5ec6..3c50f01d5f1 100644 --- a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml +++ b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml @@ -49,6 +49,13 @@ + + org.springframework.ai + spring-ai-mcp + ${project.parent.version} + test + + org.springframework.ai spring-ai-test diff --git a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java index af42d744158..64a080489ee 100644 --- a/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java +++ b/auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; +import org.springframework.ai.mcp.AsyncMcpToolCallbackProvider; +import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; import org.springframework.ai.model.tool.DefaultToolCallingManager; import org.springframework.ai.model.tool.ToolCallingManager; import org.springframework.ai.tool.StaticToolCallbackProvider; @@ -45,12 +47,17 @@ import org.springframework.util.ReflectionUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; /** * Unit tests for {@link ToolCallingAutoConfiguration}. * * @author Thomas Vitale * @author Christian Tzolov + * @author Yanming Zhou */ class ToolCallingAutoConfigurationTests { @@ -185,6 +192,27 @@ void throwExceptionOnErrorEnabled() { }); } + @Test + void toolCallbackResolverDoesNotUseMcpToolCallbackProviders() { + new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(ToolCallingAutoConfiguration.class)) + .withUserConfiguration(Config.class) + .run(context -> { + var syncMcpToolCallbackProvider = context.getBean("syncMcpToolCallbackProvider", + ToolCallbackProvider.class); + var asyncMcpToolCallbackProvider = context.getBean("asyncMcpToolCallbackProvider", + ToolCallbackProvider.class); + + verify(syncMcpToolCallbackProvider, never()).getToolCallbacks(); + verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks(); + + var toolCallbackResolver = context.getBean(ToolCallbackResolver.class); + assertThat(toolCallbackResolver.resolve("getForecast")).isNotNull(); + + verify(syncMcpToolCallbackProvider, never()).getToolCallbacks(); + verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks(); + }); + } + static class WeatherService { @Tool(description = "Get the weather in location. Return temperature in 36°F or 36°C format.") @@ -267,6 +295,20 @@ public ToolCallback toolCallbacks6() { .build(); } + @Bean + public SyncMcpToolCallbackProvider syncMcpToolCallbackProvider() { + SyncMcpToolCallbackProvider provider = mock(SyncMcpToolCallbackProvider.class); + when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]); + return provider; + } + + @Bean + public AsyncMcpToolCallbackProvider asyncMcpToolCallbackProvider() { + AsyncMcpToolCallbackProvider provider = mock(AsyncMcpToolCallbackProvider.class); + when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]); + return provider; + } + public record Request(String location) { }