Skip to content
This repository was archived by the owner on Feb 14, 2025. It is now read-only.

Commit 8b2ce26

Browse files
committed
Fix tests by restarting the container in each test
The reason is that the server performs shutdown after SSE connection is closed.
1 parent 716d1a0 commit 8b2ce26

File tree

7 files changed

+49
-20
lines changed

7 files changed

+49
-20
lines changed

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpAsyncClientTests.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,13 @@ public abstract class AbstractMcpAsyncClientTests {
5555

5656
abstract protected void createMcpTransport();
5757

58+
abstract protected void onStart();
59+
60+
abstract protected void onClose();
61+
5862
@BeforeEach
5963
void setUp() {
60-
64+
onStart();
6165
createMcpTransport();
6266

6367
assertThatCode(() -> {
@@ -72,6 +76,7 @@ void tearDown() {
7276
assertThatCode(() -> mcpAsyncClient.closeGracefully().block(Duration.ofSeconds(10)))
7377
.doesNotThrowAnyException();
7478
}
79+
onClose();
7580
}
7681

7782
@Test

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/AbstractMcpSyncClientTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,13 @@ public abstract class AbstractMcpSyncClientTests {
5555

5656
abstract protected void createMcpTransport();
5757

58+
abstract protected void onStart();
59+
60+
abstract protected void onClose();
61+
5862
@BeforeEach
5963
void setUp() {
64+
onStart();
6065
createMcpTransport();
6166

6267
assertThatCode(() -> {
@@ -70,6 +75,7 @@ void tearDown() {
7075
if (mcpSyncClient != null) {
7176
assertThatCode(() -> mcpSyncClient.close()).doesNotThrowAnyException();
7277
}
78+
onClose();
7379
}
7480

7581
@Test

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpAsyncClientTests.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.ai.mcp.client.sse;
1818

19-
import org.junit.jupiter.api.AfterAll;
20-
import org.junit.jupiter.api.BeforeAll;
2119
import org.junit.jupiter.api.Timeout;
2220
import org.testcontainers.containers.GenericContainer;
2321
import org.testcontainers.containers.wait.strategy.Wait;
@@ -38,7 +36,7 @@ class SseMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
3836

3937
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
4038
@SuppressWarnings("resource")
41-
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
39+
GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
4240
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
4341
.withExposedPorts(3001)
4442
.waitingFor(Wait.forHttp("/").forStatusCode(404));
@@ -48,15 +46,15 @@ protected void createMcpTransport() {
4846
this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host));
4947
}
5048

51-
@BeforeAll
52-
static void beforeAll() {
49+
@Override
50+
protected void onStart() {
5351
container.start();
5452
int port = container.getMappedPort(3001);
5553
host = "http://" + container.getHost() + ":" + port;
5654
}
5755

58-
@AfterAll
59-
public static void cleanup() {
56+
@Override
57+
public void onClose() {
6058
container.stop();
6159
}
6260

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseMcpSyncClientTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package org.springframework.ai.mcp.client.sse;
1818

19-
import org.junit.jupiter.api.AfterAll;
20-
import org.junit.jupiter.api.BeforeAll;
19+
import org.junit.jupiter.api.AfterEach;
20+
import org.junit.jupiter.api.BeforeEach;
2121
import org.junit.jupiter.api.Timeout;
2222
import org.testcontainers.containers.GenericContainer;
2323
import org.testcontainers.containers.wait.strategy.Wait;
@@ -38,7 +38,7 @@ class SseMcpSyncClientTests extends AbstractMcpSyncClientTests {
3838

3939
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image
4040
@SuppressWarnings("resource")
41-
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
41+
GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
4242
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
4343
.withExposedPorts(3001)
4444
.waitingFor(Wait.forHttp("/").forStatusCode(404));
@@ -48,15 +48,15 @@ protected void createMcpTransport() {
4848
this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host));
4949
}
5050

51-
@BeforeAll
52-
static void beforeAll() {
51+
@Override
52+
protected void onStart() {
5353
container.start();
5454
int port = container.getMappedPort(3001);
5555
host = "http://" + container.getHost() + ":" + port;
5656
}
5757

58-
@AfterAll
59-
public static void cleanup() {
58+
@Override
59+
protected void onClose() {
6060
container.stop();
6161
}
6262

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/sse/SseServerTransportTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class SseServerTransportTests {
5151
static String host = "http://localhost:3001";
5252

5353
@SuppressWarnings("resource")
54-
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
54+
GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
5555
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
5656
.withExposedPorts(3001)
5757
.waitingFor(Wait.forHttp("/").forStatusCode(404));
@@ -98,15 +98,15 @@ public void simulateMessageEvent(String jsonMessage) {
9898

9999
}
100100

101-
@BeforeAll
102-
static void beforeAll() {
101+
void startContainer() {
103102
container.start();
104103
int port = container.getMappedPort(3001);
105104
host = "http://" + container.getHost() + ":" + port;
106105
}
107106

108107
@BeforeEach
109108
void setUp() {
109+
startContainer();
110110
webClientBuilder = WebClient.builder().baseUrl(host);
111111
objectMapper = new ObjectMapper();
112112
transport = new TestSseServerTransport(webClientBuilder, objectMapper);
@@ -117,10 +117,10 @@ void afterEach() {
117117
if (transport != null) {
118118
assertThatCode(() -> transport.closeGracefully().block(Duration.ofSeconds(10))).doesNotThrowAnyException();
119119
}
120+
cleanup();
120121
}
121122

122-
@AfterAll
123-
static void cleanup() {
123+
void cleanup() {
124124
container.stop();
125125
}
126126

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpAsyncClientTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,14 @@ protected void createMcpTransport() {
3737
this.mcpTransport = new StdioServerTransport(stdioParams);
3838
}
3939

40+
@Override
41+
protected void onStart() {
42+
43+
}
44+
45+
@Override
46+
protected void onClose() {
47+
48+
}
49+
4050
}

spring-ai-mcp-core/src/test/java/org/springframework/ai/mcp/client/stdio/McpSyncClientTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,14 @@ protected void createMcpTransport() {
3737
this.mcpTransport = new StdioServerTransport(stdioParams);
3838
}
3939

40+
@Override
41+
protected void onStart() {
42+
43+
}
44+
45+
@Override
46+
protected void onClose() {
47+
48+
}
49+
4050
}

0 commit comments

Comments
 (0)