Skip to content

Commit 68e5324

Browse files
quaffilayaperumalg
authored andcommitted
Add test to ensure that ToolCallbackResolver doesn't use MCP ToolCallbackProviders
See GH-4751 Signed-off-by: Yanming Zhou <[email protected]>
1 parent c991bdc commit 68e5324

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@
4949
</dependency>
5050

5151
<!-- Test dependencies -->
52+
<dependency>
53+
<groupId>org.springframework.ai</groupId>
54+
<artifactId>spring-ai-mcp</artifactId>
55+
<version>${project.parent.version}</version>
56+
<scope>test</scope>
57+
</dependency>
58+
5259
<dependency>
5360
<groupId>org.springframework.ai</groupId>
5461
<artifactId>spring-ai-test</artifactId>

auto-configurations/models/tool/spring-ai-autoconfigure-model-tool/src/test/java/org/springframework/ai/model/tool/autoconfigure/ToolCallingAutoConfigurationTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import org.junit.jupiter.api.Test;
2222

23+
import org.springframework.ai.mcp.AsyncMcpToolCallbackProvider;
24+
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
2325
import org.springframework.ai.model.tool.DefaultToolCallingManager;
2426
import org.springframework.ai.model.tool.ToolCallingManager;
2527
import org.springframework.ai.tool.StaticToolCallbackProvider;
@@ -45,12 +47,17 @@
4547
import org.springframework.util.ReflectionUtils;
4648

4749
import static org.assertj.core.api.Assertions.assertThat;
50+
import static org.mockito.Mockito.mock;
51+
import static org.mockito.Mockito.never;
52+
import static org.mockito.Mockito.verify;
53+
import static org.mockito.Mockito.when;
4854

4955
/**
5056
* Unit tests for {@link ToolCallingAutoConfiguration}.
5157
*
5258
* @author Thomas Vitale
5359
* @author Christian Tzolov
60+
* @author Yanming Zhou
5461
*/
5562
class ToolCallingAutoConfigurationTests {
5663

@@ -185,6 +192,27 @@ void throwExceptionOnErrorEnabled() {
185192
});
186193
}
187194

195+
@Test
196+
void toolCallbackResolverDoesNotUseMcpToolCallbackProviders() {
197+
new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(ToolCallingAutoConfiguration.class))
198+
.withUserConfiguration(Config.class)
199+
.run(context -> {
200+
var syncMcpToolCallbackProvider = context.getBean("syncMcpToolCallbackProvider",
201+
ToolCallbackProvider.class);
202+
var asyncMcpToolCallbackProvider = context.getBean("asyncMcpToolCallbackProvider",
203+
ToolCallbackProvider.class);
204+
205+
verify(syncMcpToolCallbackProvider, never()).getToolCallbacks();
206+
verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks();
207+
208+
var toolCallbackResolver = context.getBean(ToolCallbackResolver.class);
209+
assertThat(toolCallbackResolver.resolve("getForecast")).isNotNull();
210+
211+
verify(syncMcpToolCallbackProvider, never()).getToolCallbacks();
212+
verify(asyncMcpToolCallbackProvider, never()).getToolCallbacks();
213+
});
214+
}
215+
188216
static class WeatherService {
189217

190218
@Tool(description = "Get the weather in location. Return temperature in 36°F or 36°C format.")
@@ -267,6 +295,20 @@ public ToolCallback toolCallbacks6() {
267295
.build();
268296
}
269297

298+
@Bean
299+
public SyncMcpToolCallbackProvider syncMcpToolCallbackProvider() {
300+
SyncMcpToolCallbackProvider provider = mock(SyncMcpToolCallbackProvider.class);
301+
when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]);
302+
return provider;
303+
}
304+
305+
@Bean
306+
public AsyncMcpToolCallbackProvider asyncMcpToolCallbackProvider() {
307+
AsyncMcpToolCallbackProvider provider = mock(AsyncMcpToolCallbackProvider.class);
308+
when(provider.getToolCallbacks()).thenReturn(new ToolCallback[0]);
309+
return provider;
310+
}
311+
270312
public record Request(String location) {
271313
}
272314

0 commit comments

Comments
 (0)