Skip to content

Commit 6c7342e

Browse files
committed
feat: Migrate all Java unit tests from JUnit 4 to JUnit 5 (Jupiter)
Motivation: JUnit 4 has reached end-of-life and JUnit 5 (Jupiter) provides significant improvements. The project already uses jupiter-engine 6.0.3 and has existing JUnitJupiter-named infrastructure. This migration aligns all test code with the modern Jupiter naming convention. Modification: - Replace @ClassRule/@rule with @RegisterExtension using PekkoJUnitJupiterActorSystemResource (renamed from JUnit5 variant) - Replace StreamTest5 base class with StreamTestJupiter - Replace TestKitJUnit5Extension with TestKitJUnitJupiterExtension - Replace @JUnit5TestKit with @JUnitJupiterTestKit annotation - Replace JUnit5TestKitBuilder with JUnitJupiterTestKitBuilder - Remove extends JUnitSuite (JUnit 4 base class) - Migrate Assert to Assertions, @test(expected=...) to assertThrows() - Add synchronized lifecycle methods for thread safety - Remove printStackTrace from error handling - 105 files changed across all test modules Result: All Java unit tests now use JUnit Jupiter APIs with consistent JUnitJupiter naming convention. JUnit 4 support APIs remain available for downstream users. All tests pass locally. References: - PR review feedback: #2724 (comment) - JUnit 5 User Guide: https://junit.org/junit5/docs/current/user-guide/
1 parent 32b265e commit 6c7342e

205 files changed

Lines changed: 2017 additions & 1659 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,32 @@
2020
import org.apache.pekko.actor.typed.javadsl.Behaviors;
2121
// #test-header
2222
import org.apache.pekko.actor.testkit.typed.javadsl.ActorTestKit;
23+
import org.apache.pekko.actor.testkit.typed.javadsl.JUnitJupiterTestKitBuilder;
24+
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJUnitJupiterExtension;
25+
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturingExtension;
2326

2427
// #test-header
2528
import org.apache.pekko.actor.testkit.typed.javadsl.TestProbe;
26-
import org.junit.AfterClass;
27-
import org.junit.Test;
28-
import org.scalatestplus.junit.JUnitSuite;
29+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
30+
import org.junit.jupiter.api.Test;
31+
import org.junit.jupiter.api.extension.ExtendWith;
2932

3033
import java.time.Duration;
3134
import java.util.concurrent.CompletionStage;
3235
import java.util.stream.IntStream;
3336

3437
import java.util.Objects;
3538

36-
import static org.junit.Assert.assertEquals;
39+
import static org.junit.jupiter.api.Assertions.assertEquals;
3740

3841
// #test-header
42+
@ExtendWith({TestKitJUnitJupiterExtension.class, LogCapturingExtension.class})
3943
public class AsyncTestingExampleTest
4044
// #test-header
41-
extends JUnitSuite
45+
4246
// #test-header
4347
{
44-
static final ActorTestKit testKit = ActorTestKit.create();
48+
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
4549
// #test-header
4650

4751
// #under-test
@@ -128,10 +132,7 @@ private CompletionStage<Integer> publish(int i) {
128132
// #under-test-2
129133

130134
// #test-shutdown
131-
@AfterClass
132-
public static void cleanup() {
133-
testKit.shutdownTestKit();
134-
}
135+
// Test cleanup is automatically handled by JUnit 5 extension
135136
// #test-shutdown
136137

137138
@Test
@@ -202,7 +203,7 @@ public void testObserveMockedBehavior() {
202203

203204
@Test
204205
public void systemNameShouldComeFromTestClass() {
205-
assertEquals(testKit.system().name(), "AsyncTestingExampleTest");
206+
assertEquals("AsyncTestingExampleTest", testKit.system().name());
206207
}
207208
// #test-header
208209
}

actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/JunitIntegrationExampleTest.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,23 @@
1515

1616
import static jdocs.org.apache.pekko.actor.testkit.typed.javadsl.AsyncTestingExampleTest.Echo;
1717

18-
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturing;
19-
import org.junit.Rule;
18+
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturingExtension;
2019

2120
// #junit-integration
22-
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJunitResource;
21+
import org.apache.pekko.actor.testkit.typed.javadsl.ActorTestKit;
22+
import org.apache.pekko.actor.testkit.typed.javadsl.JUnitJupiterTestKitBuilder;
23+
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJUnitJupiterExtension;
2324
import org.apache.pekko.actor.testkit.typed.javadsl.TestProbe;
25+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
2426
import org.apache.pekko.actor.typed.ActorRef;
25-
import org.junit.ClassRule;
26-
import org.junit.Test;
27+
import org.junit.jupiter.api.Test;
28+
import org.junit.jupiter.api.extension.ExtendWith;
2729

30+
@ExtendWith(TestKitJUnitJupiterExtension.class)
31+
@ExtendWith(LogCapturingExtension.class)
2832
public class JunitIntegrationExampleTest {
2933

30-
@ClassRule public static final TestKitJunitResource testKit = new TestKitJunitResource();
31-
32-
// #junit-integration
33-
// this is shown in LogCapturingExampleTest
34-
@Rule public final LogCapturing logCapturing = new LogCapturing();
35-
// #junit-integration
34+
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
3635

3736
@Test
3837
public void testSomething() {

actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/LogCapturingExampleTest.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,21 @@
1616
import static jdocs.org.apache.pekko.actor.testkit.typed.javadsl.AsyncTestingExampleTest.*;
1717

1818
// #log-capturing
19-
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturing;
20-
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJunitResource;
19+
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturingExtension;
20+
import org.apache.pekko.actor.testkit.typed.javadsl.ActorTestKit;
21+
import org.apache.pekko.actor.testkit.typed.javadsl.JUnitJupiterTestKitBuilder;
22+
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJUnitJupiterExtension;
2123
import org.apache.pekko.actor.testkit.typed.javadsl.TestProbe;
24+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
2225
import org.apache.pekko.actor.typed.ActorRef;
23-
import org.junit.ClassRule;
24-
import org.junit.Rule;
25-
import org.junit.Test;
26+
import org.junit.jupiter.api.Test;
27+
import org.junit.jupiter.api.extension.ExtendWith;
2628

29+
@ExtendWith(TestKitJUnitJupiterExtension.class)
30+
@ExtendWith(LogCapturingExtension.class)
2731
public class LogCapturingExampleTest {
2832

29-
@ClassRule public static final TestKitJunitResource testKit = new TestKitJunitResource();
30-
31-
@Rule public final LogCapturing logCapturing = new LogCapturing();
33+
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
3234

3335
@Test
3436
public void testSomething() {

actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/ManualTimerExampleTest.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,21 @@
1616
// #manual-scheduling-simple
1717

1818
import java.time.Duration;
19-
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturing;
19+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
20+
import org.apache.pekko.actor.testkit.typed.javadsl.ActorTestKit;
21+
import org.apache.pekko.actor.testkit.typed.javadsl.LogCapturingExtension;
2022
import org.apache.pekko.actor.testkit.typed.javadsl.ManualTime;
21-
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJunitResource;
23+
import org.apache.pekko.actor.testkit.typed.javadsl.TestKitJUnitJupiterExtension;
2224
import org.apache.pekko.actor.testkit.typed.javadsl.TestProbe;
2325
import org.apache.pekko.actor.typed.Behavior;
2426
import org.apache.pekko.actor.typed.javadsl.Behaviors;
25-
import org.junit.ClassRule;
26-
import org.junit.Rule;
27-
import org.junit.Test;
28-
import org.scalatestplus.junit.JUnitSuite;
27+
import org.junit.jupiter.api.Test;
28+
import org.junit.jupiter.api.extension.ExtendWith;
2929

30-
public class ManualTimerExampleTest extends JUnitSuite {
30+
@ExtendWith({TestKitJUnitJupiterExtension.class, LogCapturingExtension.class})
31+
public class ManualTimerExampleTest {
3132

32-
@ClassRule
33-
public static final TestKitJunitResource testKit = new TestKitJunitResource(ManualTime.config());
34-
35-
@Rule public final LogCapturing logCapturing = new LogCapturing();
33+
@JUnitJupiterTestKit public ActorTestKit testKit = ActorTestKit.create(ManualTime.config());
3634

3735
private final ManualTime manualTime = ManualTime.get(testKit.system());
3836

actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/SyncTestingExampleTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
package jdocs.org.apache.pekko.actor.testkit.typed.javadsl;
1515

1616
// #imports
17-
import static org.junit.Assert.assertEquals;
18-
import static org.junit.Assert.assertTrue;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertTrue;
1919

2020
import com.typesafe.config.Config;
2121
import java.time.Duration;
@@ -28,13 +28,12 @@
2828
import org.apache.pekko.actor.testkit.typed.javadsl.TestInbox;
2929
import org.apache.pekko.actor.typed.*;
3030
import org.apache.pekko.actor.typed.javadsl.*;
31-
import org.junit.Test;
32-
import org.scalatestplus.junit.JUnitSuite;
31+
import org.junit.jupiter.api.Test;
3332
import org.slf4j.event.Level;
3433

3534
// #imports
3635

37-
public class SyncTestingExampleTest extends JUnitSuite {
36+
public class SyncTestingExampleTest {
3837

3938
// #child
4039
public static class Child {
@@ -315,20 +314,20 @@ public void testSupportContextualAsk() {
315314

316315
// Completing/timing-out the ask is processed synchronously
317316
List<CapturedLogEvent> allLogEntries = test.getAllLogEntries();
318-
assertEquals(allLogEntries.size(), 1);
317+
assertEquals(1, allLogEntries.size());
319318

320319
// The message, including the synthesized "replyTo", can be inspected from the effect
321320
assertEquals(question, effect.askMessage());
322321

323322
// The response adaptation can be tested as many times as you want without completing the ask
324323
Hello.Command response1 = effect.adaptResponse(new Hello.Answer("No. Who are you?"));
325-
assertEquals(((Hello.GotAnAnswer) response1).answer, "No. Who are you?");
324+
assertEquals("No. Who are you?", ((Hello.GotAnAnswer) response1).answer);
326325

327326
// ... as can the message sent on a timeout
328327
assertTrue(effect.adaptTimeout() instanceof Hello.NoAnswerFrom);
329328

330329
// The response timeout is captured
331-
assertEquals(effect.responseTimeout().toSeconds(), 10L);
330+
assertEquals(10L, effect.responseTimeout().toSeconds());
332331
// #test-contextual-ask
333332
}
334333

actor-testkit-typed/src/test/java/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKitJUnit5Test.java renamed to actor-testkit-typed/src/test/java/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKitJUnitJupiterTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,24 @@
2222
import org.junit.jupiter.api.DisplayName;
2323
import org.junit.jupiter.api.Test;
2424
import org.junit.jupiter.api.extension.ExtendWith;
25-
import org.scalatestplus.junit.JUnitSuite;
2625

27-
@DisplayName("ActorTestKitTestJUnit5")
26+
@DisplayName("ActorTestKitTestJUnitJupiter")
2827
@ExtendWith(TestKitJUnitJupiterExtension.class)
2928
@ExtendWith(LogCapturingExtension.class)
30-
class ActorTestKitJUnit5Test extends JUnitSuite {
29+
class ActorTestKitJUnitJupiterTest {
3130

3231
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
3332

3433
@Test
3534
void systemNameShouldComeFromTestClassViaJunitResource() {
36-
assertEquals("ActorTestKitJUnit5Test", testKit.system().name());
35+
assertEquals("ActorTestKitJUnitJupiterTest", testKit.system().name());
3736
}
3837

3938
@Test
4039
void systemNameShouldComeFromTestClass() {
4140
final ActorTestKit testKit2 = ActorTestKit.create();
4241
try {
43-
assertEquals("ActorTestKitJUnit5Test", testKit2.system().name());
42+
assertEquals("ActorTestKitJUnitJupiterTest", testKit2.system().name());
4443
} finally {
4544
testKit2.shutdownTestKit();
4645
}

actor-testkit-typed/src/test/java/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKitTest.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,21 @@
1414
package org.apache.pekko.actor.testkit.typed.javadsl;
1515

1616
import static org.apache.pekko.Done.done;
17-
import static org.junit.Assert.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
1818

1919
import java.util.HashMap;
2020
import java.util.concurrent.CompletableFuture;
2121
import java.util.concurrent.TimeUnit;
2222
import org.apache.pekko.Done;
23+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
2324
import org.apache.pekko.actor.typed.javadsl.Behaviors;
24-
import org.junit.ClassRule;
25-
import org.junit.Rule;
26-
import org.junit.Test;
27-
import org.scalatestplus.junit.JUnitSuite;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
2827

29-
public class ActorTestKitTest extends JUnitSuite {
28+
@ExtendWith({TestKitJUnitJupiterExtension.class, LogCapturingExtension.class})
29+
public class ActorTestKitTest {
3030

31-
@ClassRule public static TestKitJunitResource testKit = new TestKitJunitResource();
32-
33-
@Rule public final LogCapturing logCapturing = new LogCapturing();
31+
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
3432

3533
@Test
3634
public void systemNameShouldComeFromTestClassViaJunitResource() {

actor-testkit-typed/src/test/java/org/apache/pekko/actor/testkit/typed/javadsl/BehaviorTestKitTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
package org.apache.pekko.actor.testkit.typed.javadsl;
1515

16-
import static org.junit.Assert.*;
16+
import static org.junit.jupiter.api.Assertions.*;
1717

1818
import java.time.Duration;
1919
import java.util.Arrays;
@@ -27,12 +27,11 @@
2727
import org.apache.pekko.actor.typed.Behavior;
2828
import org.apache.pekko.actor.typed.Props;
2929
import org.apache.pekko.actor.typed.javadsl.Behaviors;
30-
import org.junit.Ignore;
31-
import org.junit.Test;
32-
import org.scalatestplus.junit.JUnitSuite;
30+
import org.junit.jupiter.api.Disabled;
31+
import org.junit.jupiter.api.Test;
3332
import org.slf4j.event.Level;
3433

35-
public class BehaviorTestKitTest extends JUnitSuite {
34+
public class BehaviorTestKitTest {
3635

3736
public interface Command {}
3837

@@ -279,7 +278,7 @@ public void allowAssertionsOnEffectType() {
279278
BehaviorTestKit<Command> test = BehaviorTestKit.create(behavior);
280279
test.run(new SpawnChildren(1));
281280
Effect.Spawned spawned = test.expectEffectClass(Effect.Spawned.class);
282-
assertEquals(spawned.childName(), "child0");
281+
assertEquals("child0", spawned.childName());
283282
}
284283

285284
@Test
@@ -323,7 +322,7 @@ public void returnEffectsThatHaveTakenPlace() {
323322
}
324323

325324
@Test
326-
@Ignore("Not supported for Java API")
325+
@Disabled("Not supported for Java API")
327326
public void allowAssertionsUsingPartialFunctions() {}
328327

329328
@Test

actor-testkit-typed/src/test/java/org/apache/pekko/actor/testkit/typed/javadsl/LoggingTestKitTest.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,22 @@
1313

1414
package org.apache.pekko.actor.testkit.typed.javadsl;
1515

16-
import static org.junit.Assert.assertFalse;
17-
import static org.junit.Assert.assertTrue;
16+
import static org.junit.jupiter.api.Assertions.assertFalse;
17+
import static org.junit.jupiter.api.Assertions.assertTrue;
1818

1919
import java.util.Collections;
2020
import java.util.Optional;
2121
import org.apache.pekko.actor.testkit.typed.LoggingEvent;
2222
import org.apache.pekko.actor.testkit.typed.TestException;
23-
import org.junit.ClassRule;
24-
import org.junit.Rule;
25-
import org.junit.Test;
26-
import org.scalatestplus.junit.JUnitSuite;
23+
import org.apache.pekko.actor.testkit.typed.annotations.JUnitJupiterTestKit;
24+
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.extension.ExtendWith;
2726
import org.slf4j.event.Level;
2827

29-
public class LoggingTestKitTest extends JUnitSuite {
28+
@ExtendWith({TestKitJUnitJupiterExtension.class, LogCapturingExtension.class})
29+
public class LoggingTestKitTest {
3030

31-
@ClassRule public static TestKitJunitResource testKit = new TestKitJunitResource();
32-
33-
@Rule public final LogCapturing logCapturing = new LogCapturing();
31+
@JUnitJupiterTestKit public ActorTestKit testKit = new JUnitJupiterTestKitBuilder().build();
3432

3533
private LoggingEvent errorNoCause() {
3634
return LoggingEvent.create(

0 commit comments

Comments
 (0)