Skip to content

Commit 747e419

Browse files
committed
Merge branch '2.1.x'
2 parents 3d6def9 + 9fb0b97 commit 747e419

File tree

5 files changed

+111
-12
lines changed

5 files changed

+111
-12
lines changed

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
2929
import org.springframework.boot.autoconfigure.data.cassandra.city.City;
3030
import org.springframework.boot.test.util.TestPropertyValues;
31+
import org.springframework.boot.testsupport.testcontainers.SkippableContainer;
3132
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3233
import org.springframework.data.cassandra.config.CassandraSessionFactoryBean;
3334
import org.springframework.data.cassandra.config.SchemaAction;
@@ -43,15 +44,17 @@
4344
public class CassandraDataAutoConfigurationIntegrationTests {
4445

4546
@ClassRule
46-
public static CassandraContainer<?> cassandra = new CassandraContainer<>();
47+
public static SkippableContainer<CassandraContainer<?>> cassandra = new SkippableContainer<>(
48+
CassandraContainer::new);
4749

4850
private AnnotationConfigApplicationContext context;
4951

5052
@Before
5153
public void setUp() {
5254
this.context = new AnnotationConfigApplicationContext();
5355
TestPropertyValues
54-
.of("spring.data.cassandra.port=" + cassandra.getFirstMappedPort(),
56+
.of("spring.data.cassandra.port="
57+
+ cassandra.getContainer().getFirstMappedPort(),
5558
"spring.data.cassandra.read-timeout=24000",
5659
"spring.data.cassandra.connect-timeout=10000")
5760
.applyTo(this.context.getEnvironment());
@@ -96,7 +99,8 @@ public void hasRecreateSchemaActionSet() {
9699

97100
private void createTestKeyspaceIfNotExists() {
98101
Cluster cluster = Cluster.builder().withoutJMXReporting()
99-
.withPort(cassandra.getFirstMappedPort()).addContactPoint("localhost")
102+
.withPort(cassandra.getContainer().getFirstMappedPort())
103+
.addContactPoint(cassandra.getContainer().getContainerIpAddress())
100104
.build();
101105
try (Session session = cluster.connect()) {
102106
session.execute("CREATE KEYSPACE IF NOT EXISTS boot_test"

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestIntegrationTests.java

+17-3
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@
1818

1919
import org.junit.ClassRule;
2020
import org.junit.Test;
21+
import org.junit.rules.TestRule;
22+
import org.junit.runner.Description;
2123
import org.junit.runner.RunWith;
24+
import org.junit.runners.model.Statement;
2225
import org.neo4j.ogm.session.Session;
2326
import org.testcontainers.containers.Neo4jContainer;
2427

2528
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2629
import org.springframework.beans.factory.annotation.Autowired;
2730
import org.springframework.boot.test.util.TestPropertyValues;
31+
import org.springframework.boot.testsupport.testcontainers.SkippableContainer;
2832
import org.springframework.context.ApplicationContext;
2933
import org.springframework.context.ApplicationContextInitializer;
3034
import org.springframework.context.ConfigurableApplicationContext;
@@ -46,9 +50,18 @@
4650
@DataNeo4jTest
4751
public class DataNeo4jTestIntegrationTests {
4852

53+
public static SkippableContainer<Neo4jContainer<?>> neo4j = new SkippableContainer<Neo4jContainer<?>>(
54+
() -> new Neo4jContainer<>().withAdminPassword(null));
55+
4956
@ClassRule
50-
public static Neo4jContainer<?> neo4j = new Neo4jContainer<>()
51-
.withAdminPassword(null);
57+
public static TestRule skippableContainer = new TestRule() {
58+
59+
@Override
60+
public Statement apply(Statement base, Description description) {
61+
return neo4j.apply(base, description);
62+
}
63+
64+
};
5265

5366
@Autowired
5467
private Session session;
@@ -81,7 +94,8 @@ static class Initializer
8194
@Override
8295
public void initialize(
8396
ConfigurableApplicationContext configurableApplicationContext) {
84-
TestPropertyValues.of("spring.data.neo4j.uri=" + neo4j.getBoltUrl())
97+
TestPropertyValues
98+
.of("spring.data.neo4j.uri=" + neo4j.getContainer().getBoltUrl())
8599
.applyTo(configurableApplicationContext.getEnvironment());
86100
}
87101

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestPropertiesIntegrationTests.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.springframework.beans.factory.annotation.Autowired;
2525
import org.springframework.boot.test.util.TestPropertyValues;
26+
import org.springframework.boot.testsupport.testcontainers.SkippableContainer;
2627
import org.springframework.context.ApplicationContextInitializer;
2728
import org.springframework.context.ConfigurableApplicationContext;
2829
import org.springframework.core.env.Environment;
@@ -43,8 +44,8 @@
4344
public class DataNeo4jTestPropertiesIntegrationTests {
4445

4546
@ClassRule
46-
public static Neo4jContainer<?> neo4j = new Neo4jContainer<>()
47-
.withAdminPassword(null);
47+
public static SkippableContainer<Neo4jContainer<?>> neo4j = new SkippableContainer<Neo4jContainer<?>>(
48+
() -> new Neo4jContainer<>().withAdminPassword(null));
4849

4950
@Autowired
5051
private Environment environment;
@@ -60,7 +61,8 @@ static class Initializer
6061
@Override
6162
public void initialize(
6263
ConfigurableApplicationContext configurableApplicationContext) {
63-
TestPropertyValues.of("spring.data.neo4j.uri=" + neo4j.getBoltUrl())
64+
TestPropertyValues
65+
.of("spring.data.neo4j.uri=" + neo4j.getContainer().getBoltUrl())
6466
.applyTo(configurableApplicationContext.getEnvironment());
6567
}
6668

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/neo4j/DataNeo4jTestWithIncludeFilterIntegrationTests.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.springframework.beans.factory.annotation.Autowired;
2525
import org.springframework.boot.test.util.TestPropertyValues;
26+
import org.springframework.boot.testsupport.testcontainers.SkippableContainer;
2627
import org.springframework.context.ApplicationContextInitializer;
2728
import org.springframework.context.ConfigurableApplicationContext;
2829
import org.springframework.context.annotation.ComponentScan.Filter;
@@ -44,8 +45,8 @@
4445
public class DataNeo4jTestWithIncludeFilterIntegrationTests {
4546

4647
@ClassRule
47-
public static Neo4jContainer<?> neo4j = new Neo4jContainer<>()
48-
.withAdminPassword(null);
48+
public static SkippableContainer<Neo4jContainer<?>> neo4j = new SkippableContainer<Neo4jContainer<?>>(
49+
() -> new Neo4jContainer<>().withAdminPassword(null));
4950

5051
@Autowired
5152
private ExampleService service;
@@ -61,7 +62,8 @@ static class Initializer
6162
@Override
6263
public void initialize(
6364
ConfigurableApplicationContext configurableApplicationContext) {
64-
TestPropertyValues.of("spring.data.neo4j.uri=" + neo4j.getBoltUrl())
65+
TestPropertyValues
66+
.of("spring.data.neo4j.uri=" + neo4j.getContainer().getBoltUrl())
6567
.applyTo(configurableApplicationContext.getEnvironment());
6668
}
6769

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Copyright 2012-2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.testsupport.testcontainers;
18+
19+
import java.util.function.Supplier;
20+
21+
import org.junit.AssumptionViolatedException;
22+
import org.junit.rules.TestRule;
23+
import org.junit.runner.Description;
24+
import org.junit.runners.model.Statement;
25+
import org.testcontainers.DockerClientFactory;
26+
import org.testcontainers.containers.FailureDetectingExternalResource;
27+
import org.testcontainers.containers.GenericContainer;
28+
29+
/**
30+
* A {@link GenericContainer} decorator that skips test execution when Docker is not
31+
* available.
32+
*
33+
* @param <T> type of the underlying container
34+
* @author Andy Wilkinson
35+
*/
36+
public class SkippableContainer<T> implements TestRule {
37+
38+
private final Supplier<T> containerFactory;
39+
40+
private T container;
41+
42+
public SkippableContainer(Supplier<T> containerFactory) {
43+
this.containerFactory = containerFactory;
44+
}
45+
46+
@Override
47+
public Statement apply(Statement base, Description description) {
48+
try {
49+
DockerClientFactory.instance().client();
50+
}
51+
catch (Throwable ex) {
52+
return new SkipStatement();
53+
}
54+
this.container = this.containerFactory.get();
55+
return ((FailureDetectingExternalResource) this.container).apply(base,
56+
description);
57+
}
58+
59+
public T getContainer() {
60+
if (this.container == null) {
61+
throw new IllegalStateException(
62+
"Container cannot be accessed prior to test invocation");
63+
}
64+
return this.container;
65+
}
66+
67+
private static class SkipStatement extends Statement {
68+
69+
@Override
70+
public void evaluate() {
71+
throw new AssumptionViolatedException(
72+
"Could not find a valid Docker environment.");
73+
}
74+
75+
}
76+
77+
}

0 commit comments

Comments
 (0)