Skip to content

Commit 9631cac

Browse files
committed
Introduce MockTestcontainersConfigurationExtension
This is the replacement for MockTestcontainersConfigurationRule for internal JUnit Jupiter tests. This change removes references to BlockJUnit4ClassRunner. Tested with: ./gradlew :testcontainers:test --tests 'org.testcontainers.containers.ReusabilityUnitTests$*'
1 parent 0ef58b5 commit 9631cac

File tree

2 files changed

+64
-32
lines changed

2 files changed

+64
-32
lines changed

core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,26 @@
99
import com.github.dockerjava.api.command.InspectContainerResponse;
1010
import com.github.dockerjava.api.command.ListContainersCmd;
1111
import com.github.dockerjava.api.command.StartContainerCmd;
12+
import com.github.dockerjava.api.model.Container;
1213
import com.github.dockerjava.core.command.CreateContainerCmdImpl;
1314
import com.github.dockerjava.core.command.InspectContainerCmdImpl;
1415
import com.github.dockerjava.core.command.ListContainersCmdImpl;
1516
import com.github.dockerjava.core.command.StartContainerCmdImpl;
1617
import lombok.RequiredArgsConstructor;
1718
import lombok.experimental.FieldDefaults;
18-
import org.junit.Rule;
19-
import org.junit.jupiter.api.Nested;
2019
import org.junit.jupiter.api.Test;
20+
import org.junit.jupiter.api.extension.ExtendWith;
2121
import org.junit.jupiter.params.ParameterizedClass;
2222
import org.junit.jupiter.params.provider.MethodSource;
23-
import org.junit.runner.RunWith;
24-
import org.junit.runners.BlockJUnit4ClassRunner;
2523
import org.mockito.Answers;
2624
import org.mockito.Mockito;
2725
import org.mockito.stubbing.Answer;
2826
import org.testcontainers.DockerClientFactory;
2927
import org.testcontainers.TestImages;
3028
import org.testcontainers.containers.startupcheck.StartupCheckStrategy;
29+
import org.testcontainers.containers.startupcheck.StartupCheckStrategy.StartupStatus;
3130
import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
32-
import org.testcontainers.utility.MockTestcontainersConfigurationRule;
31+
import org.testcontainers.utility.MockTestcontainersConfigurationExtension;
3332
import org.testcontainers.utility.MountableFile;
3433
import org.testcontainers.utility.TestcontainersConfiguration;
3534

@@ -55,13 +54,13 @@
5554

5655
public class ReusabilityUnitTests {
5756

58-
@Nested
5957
@ParameterizedClass
6058
@MethodSource("data")
6159
@RequiredArgsConstructor
6260
@FieldDefaults(makeFinal = true)
63-
public class CanBeReusedTest {
64-
public Object[][] data() {
61+
public static class CanBeReusedTest {
62+
63+
public static Object[][] data() {
6564
return new Object[][] {
6665
{ "generic", new GenericContainer<>(TestImages.TINY_IMAGE), true },
6766
{ "anonymous generic", new GenericContainer(TestImages.TINY_IMAGE) {}, true },
@@ -86,14 +85,14 @@ public void shouldBeReusable() {
8685
}
8786
}
8887

89-
class CustomContainer extends GenericContainer<CustomContainer> {
88+
static class CustomContainer extends GenericContainer<CustomContainer> {
9089

9190
CustomContainer() {
9291
super(TestImages.TINY_IMAGE);
9392
}
9493
}
9594

96-
class CustomContainerWithContainerIsCreated
95+
static class CustomContainerWithContainerIsCreated
9796
extends GenericContainer<CustomContainerWithContainerIsCreated> {
9897

9998
CustomContainerWithContainerIsCreated() {
@@ -107,10 +106,8 @@ protected void containerIsCreated(String containerId) {
107106
}
108107
}
109108

110-
@Nested
111-
@RunWith(BlockJUnit4ClassRunner.class)
112109
@FieldDefaults(makeFinal = true)
113-
public class HooksTest extends AbstractReusabilityTest {
110+
public static class HooksTest extends AbstractReusabilityTest {
114111

115112
List<String> script = new ArrayList<>();
116113

@@ -189,10 +186,8 @@ public void shouldNotCallHookIfNotReused() {
189186
}
190187
}
191188

192-
@Nested
193-
@RunWith(BlockJUnit4ClassRunner.class)
194189
@FieldDefaults(makeFinal = true)
195-
public class HashTest extends AbstractReusabilityTest {
190+
public static class HashTest extends AbstractReusabilityTest {
196191

197192
protected GenericContainer<?> container = makeReusable(
198193
new GenericContainer(TestImages.TINY_IMAGE) {
@@ -304,22 +299,20 @@ public void shouldHashCopiedFiles() {
304299
}
305300
}
306301

307-
308-
interface TestStrategy {
309-
void withCopyFileToContainer(MountableFile mountableFile, String path);
310-
311-
void clear();
312-
}
313-
314-
@Nested
315302
@ParameterizedClass
316303
@MethodSource("strategies")
317304
@FieldDefaults(makeFinal = true)
318-
public class CopyFilesHashTest {
305+
public static class CopyFilesHashTest {
319306

320307
private final TestStrategy strategy;
321308

322-
private class MountableFileTestStrategy implements TestStrategy {
309+
interface TestStrategy {
310+
void withCopyFileToContainer(MountableFile mountableFile, String path);
311+
312+
void clear();
313+
}
314+
315+
private static class MountableFileTestStrategy implements TestStrategy {
323316

324317
private final GenericContainer<?> container;
325318

@@ -338,7 +331,7 @@ public void clear() {
338331
}
339332
}
340333

341-
private class TransferableTestStrategy implements TestStrategy {
334+
private static class TransferableTestStrategy implements TestStrategy {
342335

343336
private final GenericContainer<?> container;
344337

@@ -357,7 +350,7 @@ public void clear() {
357350
}
358351
}
359352

360-
public List<Function<GenericContainer<?>, TestStrategy>> strategies() {
353+
public static List<Function<GenericContainer<?>, TestStrategy>> strategies() {
361354
return Arrays.asList(MountableFileTestStrategy::new, TransferableTestStrategy::new);
362355
}
363356

@@ -508,11 +501,9 @@ public void folderPermissions() throws Exception {
508501
}
509502
}
510503

504+
@ExtendWith(MockTestcontainersConfigurationExtension.class)
511505
@FieldDefaults(makeFinal = true)
512-
public abstract class AbstractReusabilityTest {
513-
514-
@Rule
515-
public MockTestcontainersConfigurationRule configurationMock = new MockTestcontainersConfigurationRule();
506+
public abstract static class AbstractReusabilityTest {
516507

517508
protected DockerClient client = Mockito.mock(DockerClient.class);
518509

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.testcontainers.utility;
2+
3+
import org.junit.jupiter.api.extension.AfterEachCallback;
4+
import org.junit.jupiter.api.extension.BeforeEachCallback;
5+
import org.junit.jupiter.api.extension.Extension;
6+
import org.junit.jupiter.api.extension.ExtensionContext;
7+
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
8+
import org.junit.jupiter.api.extension.ExtensionContext.Store;
9+
import org.mockito.Mockito;
10+
11+
import java.util.concurrent.atomic.AtomicReference;
12+
13+
/**
14+
* This extension applies a spy on {@link TestcontainersConfiguration}
15+
* for testing features that depend on the global configuration.
16+
*/
17+
public final class MockTestcontainersConfigurationExtension implements Extension, AfterEachCallback, BeforeEachCallback {
18+
19+
private static final Namespace NAMESPACE = Namespace.create(MockTestcontainersConfigurationExtension.class);
20+
21+
private static final String PREVIOUS_REF = "previousRef";
22+
23+
private static AtomicReference<TestcontainersConfiguration> REF = TestcontainersConfiguration.getInstanceField();
24+
25+
@Override
26+
public void beforeEach(ExtensionContext context) {
27+
TestcontainersConfiguration previous = REF.get();
28+
if (previous == null) {
29+
previous = TestcontainersConfiguration.getInstance();
30+
}
31+
REF.set(Mockito.spy(previous));
32+
context.getStore(NAMESPACE).put(PREVIOUS_REF, previous);
33+
}
34+
35+
@Override
36+
public void afterEach(ExtensionContext context) {
37+
TestcontainersConfiguration previous = context.getStore(NAMESPACE).get(PREVIOUS_REF, TestcontainersConfiguration.class);
38+
REF.set(previous);
39+
Mockito.validateMockitoUsage();
40+
}
41+
}

0 commit comments

Comments
 (0)