Skip to content

Commit cb57c96

Browse files
committed
Fix SpringIntegrationTestExecutionListener for restart
Related to: spring-projects/spring-framework#35168 Spring Framework has introduced recently an optimization for cached contexts. So, if one is not used, it is stopped in the cache. When we pull it next time from there, it is restarted. The `SpringIntegrationTestExecutionListener` ha a flaw to change the state of the endpoints in the application context, but never reset it back to original. The problem has become apparent because of not reset auto-startup status of endpoints and that `AC.restart()` * Fix `SpringIntegrationTestExecutionListener` to use `setAutoStartup(false)` on `autoStartupCandidates` in the `afterTestClass()`. This is exactly a state the `MockIntegrationContext` has gathered them in its initialization phase. * Fix `MockIntegrationContext.autoStartupCandidates` to be a `Set` instead. The point is that `postProcessBeforeInitialization()` deals with `AbstractEndpoint` beans. And then `afterSingletonsInstantiated()` also gathers those beans from the `BeanFactory`. So, with a `Set` we aim for no duplications
1 parent c0334ee commit cb57c96

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

spring-integration-test/src/main/java/org/springframework/integration/test/context/MockIntegrationContext.java

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

1717
package org.springframework.integration.test.context;
1818

19-
import java.util.ArrayList;
2019
import java.util.Arrays;
2120
import java.util.Collection;
2221
import java.util.Collections;
23-
import java.util.List;
22+
import java.util.HashSet;
23+
import java.util.Set;
2424

2525
import reactor.core.publisher.Mono;
2626

@@ -79,7 +79,7 @@ public class MockIntegrationContext implements BeanPostProcessor, SmartInitializ
7979

8080
private final MultiValueMap<String, Object> beans = new LinkedMultiValueMap<>();
8181

82-
private final List<AbstractEndpoint> autoStartupCandidates = new ArrayList<>();
82+
private final Set<AbstractEndpoint> autoStartupCandidates = new HashSet<>();
8383

8484
private ConfigurableListableBeanFactory beanFactory;
8585

@@ -99,8 +99,9 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
9999
}
100100

101101
private void addAutoStartupCandidates(AbstractEndpoint endpoint) {
102-
endpoint.setAutoStartup(false);
103-
this.autoStartupCandidates.add(endpoint);
102+
if (this.autoStartupCandidates.add(endpoint)) {
103+
endpoint.setAutoStartup(false);
104+
}
104105
}
105106

106107
@Override
@@ -112,8 +113,8 @@ public void afterSingletonsInstantiated() {
112113
.forEach(this::addAutoStartupCandidates);
113114
}
114115

115-
List<AbstractEndpoint> getAutoStartupCandidates() {
116-
return Collections.unmodifiableList(this.autoStartupCandidates);
116+
Set<AbstractEndpoint> getAutoStartupCandidates() {
117+
return Collections.unmodifiableSet(this.autoStartupCandidates);
117118
}
118119

119120
/**

spring-integration-test/src/main/java/org/springframework/integration/test/context/SpringIntegrationTestExecutionListener.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.springframework.integration.test.context;
1818

1919
import java.util.Arrays;
20-
import java.util.List;
20+
import java.util.Set;
2121

2222
import org.springframework.context.ApplicationContext;
2323
import org.springframework.integration.endpoint.AbstractEndpoint;
@@ -37,7 +37,7 @@
3737
*/
3838
class SpringIntegrationTestExecutionListener implements TestExecutionListener {
3939

40-
private List<AbstractEndpoint> autoStartupCandidates;
40+
private Set<AbstractEndpoint> autoStartupCandidates;
4141

4242
@Override
4343
public void prepareTestInstance(TestContext testContext) {
@@ -49,16 +49,17 @@ public void prepareTestInstance(TestContext testContext) {
4949
ApplicationContext applicationContext = testContext.getApplicationContext();
5050
MockIntegrationContext mockIntegrationContext = applicationContext.getBean(MockIntegrationContext.class);
5151
this.autoStartupCandidates = mockIntegrationContext.getAutoStartupCandidates();
52-
this.autoStartupCandidates
53-
.stream()
52+
this.autoStartupCandidates.stream()
5453
.filter(endpoint -> !match(endpoint.getBeanName(), patterns))
5554
.peek(endpoint -> endpoint.setAutoStartup(true))
5655
.forEach(AbstractEndpoint::start);
5756
}
5857

5958
@Override
6059
public void afterTestClass(TestContext testContext) {
61-
this.autoStartupCandidates.forEach(AbstractEndpoint::stop);
60+
this.autoStartupCandidates.stream()
61+
.peek(endpoint -> endpoint.setAutoStartup(false))
62+
.forEach(AbstractEndpoint::stop);
6263
}
6364

6465
private static boolean match(String name, String[] patterns) {

0 commit comments

Comments
 (0)