Add lifecycle module: @BeforeAll/@AfterAll demos on JUnit 6.1.3

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KqJyCidz3ZgRyHABv2GVJh
This commit is contained in:
2026-09-30 19:02:06 +00:00
co-authored by Claude Sonnet 5.5
parent 5ed079dff3
commit cfc6c79fc3
22 changed files with 689 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
# JUnit @BeforeAll / @AfterAll Demonstration
Runnable companion to the ankurm.com article "JUnit @BeforeAll and @AfterAll: One-Time Setup and Teardown".
Every scenario is a small fixture class in `Fixtures.java`. The real tests execute each fixture through the
JUnit Launcher, assert on what happened, and write the event log to `output/`, so each transcript quoted in
the article is also an assertion that fails the build when it stops being true.
## Versions
| Item | Version |
|------|---------|
| JUnit (default, `junit.version`) | 6.1.3 (Jupiter, Platform, Launcher) |
| Also run green on | 5.14.4 (`mvn test -Djunit.version=5.14.4`; see note on `SharedServerExtension`) |
| Java | 17 language level (`maven.compiler.release`), run on JDK 25.0.4.1 |
| Maven Surefire | 3.5.4 |
## Scenarios
| Fixture | What it shows | Output |
|---------|---------------|--------|
| `StaticHooks` | default lifecycle: static hooks, a new instance per test | `01-static-default.txt` |
| `PerClassHooks` | `@TestInstance(PER_CLASS)`: instance hooks, one shared instance | `02-per-class.txt` |
| `NonStaticWithoutPerClass` | the classic mistake; discovery fails | `03-non-static-rejected.txt` |
| `BeforeAllFails` | failing `@BeforeAll` skips tests, `@AfterAll` still runs | `04-beforeall-fails.txt` |
| `BeforeAllFailsUnguarded` | unguarded `@AfterAll` NPE is attached as suppressed | `05-afterall-unguarded.txt` |
| `AfterAllThrows` | one failing `@AfterAll` does not stop the next | `06-afterall-throws.txt` |
| `Sub` / `Base` | inheritance order | `07-inheritance.txt` |
| `HidingSub` / `HidingBase` | a hidden static `@BeforeAll` still runs | `08-hiding.txt` |
| `TwoBeforeAllInOneClass` | order among several hooks in one class | `09-two-beforeall.txt` |
| `OuterWithNested` | static `@BeforeAll` inside `@Nested` | `10-nested.txt` |
| `SharedTempDir` | static `@TempDir` shared by the class | `11-shared-tempdir.txt` |
| `UsesServerA` / `UsesServerB` | root-store `AutoCloseable` owned by an extension | `12-extension-store.txt` |
| `NonStaticWithoutPerClass` + config | `junit.jupiter.testinstance.lifecycle.default=per_class` | `13-default-per-class-config.txt` |
Note: `SharedServerExtension` uses `Store.computeIfAbsent(Class)`, which exists from 6.0. On 5.14.x use
`getOrComputeIfAbsent(Class)` (deprecated since 6.0); with that one-word change the whole suite passes on 5.14.4.
## Prerequisites
- JDK 17 or higher
- Maven 3.6+
## How to Run
```bash
mvn test
```
The transcripts in `output/` are regenerated by that command. Instance hash codes in `01` and `02` change per run.