Why: `org.bukkit.inventory.ItemType.<clinit>` iterates over Material and + * looks each entry up in the registry. If it runs before MockBukkit has populated + * the registry (e.g., when a panel test that doesn't extend AbstractChallengesTest + * runs first on CI's filesystem ordering), it throws NoSuchElementException, and + * ItemStackMock stays in an errored state for the rest of the JVM — poisoning every + * subsequent test. Touching `Tag.LEAVES` forces the registry to populate before + * ItemType loads. + */ + public static void primeBukkitRegistry() { + @SuppressWarnings("unused") + var unused = org.bukkit.Tag.LEAVES; + } + /** * Set up user translation mocks to return the key for any invocation. * Uses a lenient default answer that returns the first String argument diff --git a/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java b/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java index 08d910e..bdefd47 100644 --- a/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java +++ b/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java @@ -54,6 +54,7 @@ class AdminPanelTest { void setUp() throws Exception { closeable = MockitoAnnotations.openMocks(this); ServerMock mbServer = MockBukkit.mock(); + PanelTestHelper.primeBukkitRegistry(); when(addon.getChallengesManager()).thenReturn(manager); PanelTestHelper.setupUserTranslations(user); diff --git a/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java b/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java index 36c2a55..2a184d8 100644 --- a/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java +++ b/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java @@ -47,6 +47,7 @@ class ListChallengesPanelTest { void setUp() { closeable = MockitoAnnotations.openMocks(this); ServerMock mbServer = MockBukkit.mock(); + PanelTestHelper.primeBukkitRegistry(); when(addon.getChallengesManager()).thenReturn(manager); PanelTestHelper.setupUserTranslations(user); diff --git a/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java b/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java index 038f09e..bffd0f0 100644 --- a/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java +++ b/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java @@ -58,6 +58,7 @@ class GameModePanelTest { void setUp() { closeable = MockitoAnnotations.openMocks(this); ServerMock mbServer = MockBukkit.mock(); + PanelTestHelper.primeBukkitRegistry(); when(addon.getChallengesManager()).thenReturn(manager); PanelTestHelper.setupUserTranslations(user); diff --git a/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java b/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java index 322b609..19ca940 100644 --- a/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java +++ b/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java @@ -53,6 +53,7 @@ class MultiplePanelTest { void setUp() { closeable = MockitoAnnotations.openMocks(this); ServerMock mbServer = MockBukkit.mock(); + PanelTestHelper.primeBukkitRegistry(); PanelTestHelper.setupUserTranslations(user); when(user.getWorld()).thenReturn(world);