From 8ec8c69f829f511330cf762762c86bdf225952f7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 5 Jun 2026 18:23:22 -0700 Subject: [PATCH 1/3] Update to Java 21, Paper 1.21.11, BentoBox 3.14.0 Modernise the build: bump java.version to 21, replace the Spigot API with Paper 1.21.11, and target BentoBox 3.14.0-SNAPSHOT. Production code compiles unchanged against the new API. Swap the test stack from JUnit 4 + PowerMock to JUnit 5 + MockBukkit + Mockito 5. Replace the Spigot repository with PaperMC and add the codemc snapshots repository for MockBukkit. Add true to the compiler plugin for Java 21. Co-Authored-By: Claude Opus 4.8 --- pom.xml | 70 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 1129ed8..22c446f 100644 --- a/pom.xml +++ b/pom.xml @@ -50,13 +50,14 @@ UTF-8 UTF-8 - 17 + 21 1.7 - - 2.0.9 - 1.21.3-R0.1-SNAPSHOT - 2.7.1-SNAPSHOT + 1.21.11-R0.1-SNAPSHOT + 3.14.0-SNAPSHOT + 5.10.2 + 5.11.0 + 4.110.0 ${build.version}-SNAPSHOT @@ -112,8 +113,8 @@ - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots + papermc + https://repo.papermc.io/repository/maven-public/ bentoboxworld @@ -124,8 +125,8 @@ https://repo.codemc.org/repository/maven-public/ - codemc-public - https://repo.codemc.org/repository/maven-public/ + codemc + https://repo.codemc.org/repository/maven-snapshots/ jitpack.io @@ -135,37 +136,51 @@ - + - org.spigotmc - spigot-api - ${spigot.version} + io.papermc.paper + paper-api + ${paper.version} provided - - org.mockito - mockito-core - 3.0.0 + world.bentobox + bentobox + ${bentobox.version} + provided + + + + org.mockbukkit.mockbukkit + mockbukkit-v1.21 + ${mock-bukkit.version} test + - org.powermock - powermock-module-junit4 - ${powermock.version} + org.junit.jupiter + junit-jupiter-api + ${junit.version} test - org.powermock - powermock-api-mockito2 - ${powermock.version} + org.junit.jupiter + junit-jupiter-engine + ${junit.version} test + - world.bentobox - bentobox - ${bentobox.version} - provided + org.mockito + mockito-core + ${mockito.version} + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test @@ -222,6 +237,7 @@ 3.15.0 ${java.version} + true org.apache.maven.plugins From bf180c3e758753d3c4648fe0e676cbf8060d28a0 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 5 Jun 2026 18:23:29 -0700 Subject: [PATCH 2/3] Migrate test suite to JUnit 5 + MockBukkit Rewrite all 13 test classes (158 tests) from JUnit 4 + PowerMock to JUnit 5 + MockBukkit + Mockito 5, preserving full coverage and the same 158 test cases. Add shared MockBukkit infrastructure (WhiteBox, TestWorldSettings, CommonTestSetup) adapted from the CaveBlock pattern. PowerMock static mocking is replaced with Mockito inline static mocks (Bukkit, Util, DatabaseSetup) and a real MockBukkit server. MoneyTest and PhManagerTest run as standalone Mockito tests since they need no Bukkit server. Co-Authored-By: Claude Opus 4.8 --- .../world/bentobox/bank/BankManagerTest.java | 163 +++------ .../java/world/bentobox/bank/BankTest.java | 262 ++++--------- .../world/bentobox/bank/CommonTestSetup.java | 221 +++++++++++ .../world/bentobox/bank/PhManagerTest.java | 111 +++--- .../bentobox/bank/TestWorldSettings.java | 345 ++++++++++++++++++ .../java/world/bentobox/bank/WhiteBox.java | 13 + .../admin/AdminBalanceCommandTest.java | 78 ++-- .../commands/admin/AdminGiveCommandTest.java | 82 ++--- .../commands/admin/AdminSetCommandTest.java | 80 ++-- .../admin/AdminStatementCommandTest.java | 89 ++--- .../commands/admin/AdminTakeCommandTest.java | 88 ++--- .../commands/user/BalanceCommandTest.java | 74 ++-- .../commands/user/DepositCommandTest.java | 95 ++--- .../commands/user/StatementCommandTest.java | 83 ++--- .../commands/user/WithdrawCommandTest.java | 96 ++--- .../world/bentobox/bank/data/MoneyTest.java | 32 +- 16 files changed, 1010 insertions(+), 902 deletions(-) create mode 100644 src/test/java/world/bentobox/bank/CommonTestSetup.java create mode 100644 src/test/java/world/bentobox/bank/TestWorldSettings.java create mode 100644 src/test/java/world/bentobox/bank/WhiteBox.java diff --git a/src/test/java/world/bentobox/bank/BankManagerTest.java b/src/test/java/world/bentobox/bank/BankManagerTest.java index dcf7077..9dfebf6 100644 --- a/src/test/java/world/bentobox/bank/BankManagerTest.java +++ b/src/test/java/world/bentobox/bank/BankManagerTest.java @@ -1,43 +1,27 @@ package world.bentobox.bank; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.beans.IntrospectionException; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Comparator; import java.util.UUID; import java.util.concurrent.CompletableFuture; import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import world.bentobox.bank.data.BankAccounts; import world.bentobox.bank.data.Money; import world.bentobox.bank.data.TxType; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.Settings; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.events.island.IslandEvent.Reason; @@ -45,82 +29,56 @@ import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.AbstractDatabaseHandler; import world.bentobox.bentobox.database.DatabaseSetup; -import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType; import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, DatabaseSetup.class, Util.class, IslandsManager.class }) -public class BankManagerTest { +class BankManagerTest extends CommonTestSetup { @Mock private Bank addon; // Class under test private BankManager bm; - private static AbstractDatabaseHandler h; - @Mock - private BentoBox plugin; - @Mock - private Settings pluginSettings; + @SuppressWarnings("rawtypes") + private AbstractDatabaseHandler h; @Mock private User user; - @Mock - private World world; private Island island; - @Mock - private IslandsManager im; private String uniqueId; - @Mock - private Location location; private world.bentobox.bank.Settings settings; - + private MockedStatic mockDb; @SuppressWarnings("unchecked") - @BeforeClass - public static void beforeClass() throws IllegalAccessException, InvocationTargetException, IntrospectionException { - // This has to be done beforeClass otherwise the tests will interfere with each other + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + + // Database mock h = mock(AbstractDatabaseHandler.class); - // Database - PowerMockito.mockStatic(DatabaseSetup.class); + mockDb = Mockito.mockStatic(DatabaseSetup.class); DatabaseSetup dbSetup = mock(DatabaseSetup.class); - when(DatabaseSetup.getDatabase()).thenReturn(dbSetup); + mockDb.when(DatabaseSetup::getDatabase).thenReturn(dbSetup); when(dbSetup.getHandler(any())).thenReturn(h); when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true)); - } - /** - */ - @Before - public void setUp() { when(addon.getPlugin()).thenReturn(plugin); - // Set up plugin - Whitebox.setInternalState(BentoBox.class, "instance", plugin); - - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - PowerMockito.mockStatic(IslandsManager.class, Mockito.RETURNS_MOCKS); - // The database type has to be created one line before the thenReturn() to work! - DatabaseType value = DatabaseType.JSON; - when(plugin.getSettings()).thenReturn(pluginSettings); - when(pluginSettings.getDatabaseType()).thenReturn(value); + // Island manager when(addon.getIslands()).thenReturn(im); uniqueId = UUID.randomUUID().toString(); island = new Island(); island.setUniqueId(uniqueId); - when(location.getWorld()).thenReturn(world); - when(location.clone()).thenReturn(location); island.setCenter(location); when(im.getIsland(world, user)).thenReturn(island); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); // Addon settings settings = new world.bentobox.bank.Settings(); @@ -129,75 +87,63 @@ public void setUp() { bm = new BankManager(addon); } - /** - * @throws java.lang.Exception - exception - */ - @After + @Override + @AfterEach public void tearDown() throws Exception { - deleteAll(new File("database")); - User.clearUsers(); - Mockito.framework().clearInlineMocks(); - } - - private static void deleteAll(File file) throws IOException { - if (file.exists()) { - Files.walk(file.toPath()) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); + if (mockDb != null) { + mockDb.closeOnDemand(); } + super.tearDown(); } /** * Test method for {@link world.bentobox.bank.BankManager#BankManager(world.bentobox.bank.Bank)}. */ @Test - public void testBankManager() { - PowerMockito.verifyStatic(Bukkit.class); - Bukkit.getScheduler(); + void testBankManager() { + mockedBukkit.verify(Bukkit::getScheduler); } /** * Test method for {@link world.bentobox.bank.BankManager#loadBalances()}. */ @Test - public void testLoadBalances() { + void testLoadBalances() { bm.loadBalances(); - PowerMockito.verifyStatic(Bukkit.class, times(2)); - Bukkit.getScheduler(); + mockedBukkit.verify(Bukkit::getScheduler, times(2)); } /** - * Test method for {@link world.bentobox.bank.BankManager#deposit(world.bentobox.bentobox.api.user.User, double, org.bukkit.World)}. + * Test method for {@link world.bentobox.bank.BankManager#deposit(world.bentobox.bentobox.api.user.User, world.bentobox.bank.data.Money, org.bukkit.World)}. */ @Test - public void testDepositUserDoubleWorld() { + void testDepositUserDoubleWorld() { bm.deposit(user, new Money(100), world).thenAccept(r -> assertEquals(BankResponse.SUCCESS, r)); } /** - * Test method for {@link world.bentobox.bank.BankManager#deposit(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, double, world.bentobox.bank.data.TxType)}. + * Test method for {@link world.bentobox.bank.BankManager#deposit(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, world.bentobox.bank.data.Money, world.bentobox.bank.data.TxType)}. */ @Test - public void testDepositUserIslandDoubleTxType() { + void testDepositUserIslandDoubleTxType() { for (TxType type : TxType.values()) { bm.deposit(user, island, new Money(100), type).thenAccept(r -> assertEquals(BankResponse.SUCCESS, r)); } } /** - * Test method for {@link world.bentobox.bank.BankManager#withdraw(world.bentobox.bentobox.api.user.User, double, org.bukkit.World)}. + * Test method for {@link world.bentobox.bank.BankManager#withdraw(world.bentobox.bentobox.api.user.User, world.bentobox.bank.data.Money, org.bukkit.World)}. */ @Test - public void testWithdrawUserDoubleWorld() { + void testWithdrawUserDoubleWorld() { bm.withdraw(user, new Money(100), world).thenAccept(r -> assertEquals(BankResponse.SUCCESS, r)); } /** - * Test method for {@link world.bentobox.bank.BankManager#withdraw(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, double, world.bentobox.bank.data.TxType)}. + * Test method for {@link world.bentobox.bank.BankManager#withdraw(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.database.objects.Island, world.bentobox.bank.data.Money, world.bentobox.bank.data.TxType)}. */ @Test - public void testWithdrawUserIslandDoubleTxType() { + void testWithdrawUserIslandDoubleTxType() { for (TxType type : TxType.values()) { bm.withdraw(user, island, new Money(100), type).thenAccept(r -> assertEquals(BankResponse.SUCCESS, r)); } @@ -207,7 +153,7 @@ public void testWithdrawUserIslandDoubleTxType() { * Test method for {@link world.bentobox.bank.BankManager#getBalance(world.bentobox.bentobox.database.objects.Island)}. */ @Test - public void testGetBalanceIsland() { + void testGetBalanceIsland() { assertEquals(0D, bm.getBalance(island).getValue(), 0D); } @@ -215,7 +161,7 @@ public void testGetBalanceIsland() { * Test method for {@link world.bentobox.bank.BankManager#getBalance(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetBalanceUserWorld() { + void testGetBalanceUserWorld() { assertEquals(0D, bm.getBalance(user, world).getValue(), 0D); } @@ -223,23 +169,23 @@ public void testGetBalanceUserWorld() { * Test method for {@link world.bentobox.bank.BankManager#getHistory(world.bentobox.bentobox.database.objects.Island)}. */ @Test - public void testGetHistory() { + void testGetHistory() { assertTrue(bm.getHistory(island).isEmpty()); } /** - * Test method for {@link world.bentobox.bank.BankManager#getBalances(World)}. + * Test method for {@link world.bentobox.bank.BankManager#getBalances(org.bukkit.World)}. */ @Test - public void testGetBalances() { + void testGetBalances() { assertTrue(bm.getBalances(world).isEmpty()); } /** - * Test method for {@link world.bentobox.bank.BankManager#set(world.bentobox.bentobox.api.user.User, java.lang.String, double, double, world.bentobox.bank.data.TxType)}. + * Test method for {@link world.bentobox.bank.BankManager#set(world.bentobox.bentobox.api.user.User, java.lang.String, world.bentobox.bank.data.Money, world.bentobox.bank.data.Money, world.bentobox.bank.data.TxType)}. */ @Test - public void testSet() { + void testSet() { String islandID = ""; for (TxType type : TxType.values()) { bm.set(user, islandID, new Money(10), new Money(100), type).thenAccept(r -> assertEquals(BankResponse.SUCCESS, r)); @@ -250,12 +196,12 @@ public void testSet() { * Test method for {@link world.bentobox.bank.BankManager#onIslandDelete(world.bentobox.bentobox.api.events.island.IslandEvent.IslandPreclearEvent)}. */ @Test - public void testOnIslandDelete() { + void testOnIslandDelete() { IslandBaseEvent e = new IslandEvent.IslandEventBuilder().oldIsland(island).reason(Reason.PRECLEAR).island(island).build(); if (e.getNewEvent().isPresent()) { e = e.getNewEvent().get(); } - bm.onIslandDelete((IslandPreclearEvent)e); + bm.onIslandDelete((IslandPreclearEvent) e); verify(h).deleteID(uniqueId); } @@ -263,7 +209,7 @@ public void testOnIslandDelete() { * Test method for {@link world.bentobox.bank.BankManager#calculateInterest(world.bentobox.bank.data.BankAccounts)}. */ @Test - public void testOnCalculateInterestZeroBalance() { + void testOnCalculateInterestZeroBalance() { BankAccounts ba = new BankAccounts(); assertEquals(0D, bm.calculateInterest(ba).getValue(), 0D); } @@ -272,7 +218,7 @@ public void testOnCalculateInterestZeroBalance() { * Test method for {@link world.bentobox.bank.BankManager#calculateInterest(world.bentobox.bank.data.BankAccounts)}. */ @Test - public void testOnCalculateInterestOneYear10() { + void testOnCalculateInterestOneYear10() { calculate(10, 11051.56D, BankManager.MILLISECONDS_IN_YEAR); BankAccounts ba = new BankAccounts(); settings.setInterestRate(10); // 10% @@ -285,15 +231,15 @@ public void testOnCalculateInterestOneYear10() { * Test method for {@link world.bentobox.bank.BankManager#calculateInterest(world.bentobox.bank.data.BankAccounts)}. */ @Test - public void testOnCalculateInterestOneDay10() { - calculate(10, 10002.74D, (long)24 * 60 * 60 * 1000); + void testOnCalculateInterestOneDay10() { + calculate(10, 10002.74D, (long) 24 * 60 * 60 * 1000); } /** * Test method for {@link world.bentobox.bank.BankManager#calculateInterest(world.bentobox.bank.data.BankAccounts)}. */ @Test - public void testOnCalculateInterestOneYear25() { + void testOnCalculateInterestOneYear25() { calculate(25, 12839.16D, BankManager.MILLISECONDS_IN_YEAR); } @@ -301,17 +247,16 @@ public void testOnCalculateInterestOneYear25() { * Test method for {@link world.bentobox.bank.BankManager#calculateInterest(world.bentobox.bank.data.BankAccounts)}. */ @Test - public void testOnCalculateInterestOneYear0() { + void testOnCalculateInterestOneYear0() { calculate(0, 10000D, BankManager.MILLISECONDS_IN_YEAR); } private void calculate(int i, double d, long milliseconds) { BankAccounts ba = new BankAccounts(); - settings.setInterestRate(i); // 10% + settings.setInterestRate(i); ba.setBalance(new Money(10000)); ba.setInterestLastPaid(System.currentTimeMillis() - milliseconds); assertEquals(d, bm.calculateInterest(ba).getValue(), 0D); - } } diff --git a/src/test/java/world/bentobox/bank/BankTest.java b/src/test/java/world/bentobox/bank/BankTest.java index 303b7aa..72318fc 100644 --- a/src/test/java/world/bentobox/bank/BankTest.java +++ b/src/test/java/world/bentobox/bank/BankTest.java @@ -1,266 +1,145 @@ package world.bentobox.bank; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; -import java.util.Comparator; import java.util.Optional; -import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; -import java.util.logging.Logger; -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.UnsafeValues; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.PluginManager; -import org.bukkit.scheduler.BukkitScheduler; -import org.eclipse.jdt.annotation.NonNull; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; -import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.Settings; import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.commands.CompositeCommand; -import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType; -import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.database.AbstractDatabaseHandler; +import world.bentobox.bentobox.database.DatabaseSetup; import world.bentobox.bentobox.hooks.VaultHook; import world.bentobox.bentobox.managers.AddonsManager; import world.bentobox.bentobox.managers.CommandsManager; -import world.bentobox.bentobox.managers.FlagsManager; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; -import world.bentobox.bentobox.managers.PlaceholdersManager; +/** + * Tests for {@link Bank}. + */ +class BankTest extends CommonTestSetup { -@SuppressWarnings("deprecation") -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, User.class, IslandsManager.class }) -public class BankTest { - - private static File jFile; - @Mock - private User user; - @Mock - private IslandsManager im; - @Mock - private Island island; - @Mock - private BentoBox plugin; - @Mock - private FlagsManager fm; @Mock private GameModeAddon gameMode; @Mock private AddonsManager am; @Mock - private BukkitScheduler scheduler; - - @Mock - private Settings pluginSettings; - - private Bank addon; - - @Mock - private Logger logger; - @Mock - private PlaceholdersManager phm; - @Mock private CompositeCommand cmd; @Mock private CompositeCommand adminCmd; @Mock - private World world; - private UUID uuid; - - @Mock - private PluginManager pim; - @Mock private VaultHook vh; - @BeforeClass - public static void beforeClass() throws IOException { - // Make the addon jar - jFile = new File("addon.jar"); - // Copy over config file from src folder - Path fromPath = Paths.get("src/main/resources/config.yml"); - Path path = Paths.get("config.yml"); - Files.copy(fromPath, path); - try (JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(jFile))) { - //Added the new files to the jar. - try (FileInputStream fis = new FileInputStream(path.toFile())) { - byte[] buffer = new byte[1024]; - int bytesRead = 0; - JarEntry entry = new JarEntry(path.toString()); - tempJarOutputStream.putNextEntry(entry); - while((bytesRead = fis.read(buffer)) != -1) { - tempJarOutputStream.write(buffer, 0, bytesRead); - } - } - } - } + private Bank addon; + private File jFile; + private MockedStatic mockDb; - @Before + @SuppressWarnings("unchecked") + @Override + @BeforeEach public void setUp() throws Exception { - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - PowerMockito.mockStatic(IslandsManager.class, Mockito.RETURNS_MOCKS); - // Set up plugin - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + super.setUp(); - // The database type has to be created one line before the thenReturn() to work! - DatabaseType value = DatabaseType.JSON; - when(plugin.getSettings()).thenReturn(pluginSettings); - when(pluginSettings.getDatabaseType()).thenReturn(value); + // Database mock + AbstractDatabaseHandler h = mock(AbstractDatabaseHandler.class); + mockDb = Mockito.mockStatic(DatabaseSetup.class); + DatabaseSetup dbSetup = mock(DatabaseSetup.class); + mockDb.when(DatabaseSetup::getDatabase).thenReturn(dbSetup); + when(dbSetup.getHandler(any())).thenReturn(h); + when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true)); // Command manager CommandsManager cm = mock(CommandsManager.class); when(plugin.getCommandsManager()).thenReturn(cm); - // Player - Player p = mock(Player.class); - when(user.isOp()).thenReturn(false); - uuid = UUID.randomUUID(); - when(user.getUniqueId()).thenReturn(uuid); - when(user.getPlayer()).thenReturn(p); - when(user.getName()).thenReturn("tastybento"); - User.setPlugin(plugin); - - // Island World Manager - IslandWorldManager iwm = mock(IslandWorldManager.class); - when(plugin.getIWM()).thenReturn(iwm); - - // Player has island to begin with - when(im.getIsland(any(), any(UUID.class))).thenReturn(island); - when(plugin.getIslands()).thenReturn(im); - - // Locales - // Return the reference (USE THIS IN THE FUTURE) - when(user.getTranslation(anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - - // Server - Server server = mock(Server.class); - when(Bukkit.getServer()).thenReturn(server); - when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); - when(Bukkit.getPluginManager()).thenReturn(mock(PluginManager.class)); - - // Addon - addon = new Bank(); - File dataFolder = new File("addons/Bank"); - addon.setDataFolder(dataFolder); - addon.setFile(jFile); - AddonDescription desc = new AddonDescription.Builder("bentobox", "Bank", "1.3").description("test").authors("tastybento").build(); - addon.setDescription(desc); - // Addons manager + // Addons manager - one game mode (BSkyBlock) when(plugin.getAddonsManager()).thenReturn(am); - // One game mode when(am.getGameModeAddons()).thenReturn(Collections.singletonList(gameMode)); - AddonDescription desc2 = new AddonDescription.Builder("bentobox", "BSkyBlock", "1.3").description("test").authors("tasty").build(); + AddonDescription desc2 = new AddonDescription.Builder("bentobox", "BSkyBlock", "1.3").description("test") + .authors("tasty").build(); when(gameMode.getDescription()).thenReturn(desc2); when(gameMode.getOverWorld()).thenReturn(world); - - // Player command - @NonNull - Optional opCmd = Optional.of(cmd); - when(gameMode.getPlayerCommand()).thenReturn(opCmd); - // Admin command - Optional opAdminCmd = Optional.of(adminCmd); - when(gameMode.getAdminCommand()).thenReturn(opAdminCmd); + when(gameMode.getPlayerCommand()).thenReturn(Optional.of(cmd)); + when(gameMode.getAdminCommand()).thenReturn(Optional.of(adminCmd)); // Flags manager when(plugin.getFlagsManager()).thenReturn(fm); when(fm.getFlags()).thenReturn(Collections.emptyList()); - - // Bukkit - when(Bukkit.getScheduler()).thenReturn(scheduler); - ItemMeta meta = mock(ItemMeta.class); - ItemFactory itemFactory = mock(ItemFactory.class); - when(itemFactory.getItemMeta(any())).thenReturn(meta); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); - UnsafeValues unsafe = mock(UnsafeValues.class); - when(unsafe.getDataVersion()).thenReturn(777); - when(Bukkit.getUnsafe()).thenReturn(unsafe); - when(Bukkit.getPluginManager()).thenReturn(pim); - - // placeholders + // Placeholders when(plugin.getPlaceholdersManager()).thenReturn(phm); // World when(world.getName()).thenReturn("bskyblock-world"); - // Island - when(island.getWorld()).thenReturn(world); - when(island.getOwner()).thenReturn(uuid); // Vault when(plugin.getVault()).thenReturn(Optional.of(vh)); - } - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception { - deleteAll(new File("database")); + // Build the addon jar containing the real config.yml + jFile = new File("addon.jar"); + String configYml = new String(Files.readAllBytes(Paths.get("src/main/resources/config.yml")), + StandardCharsets.UTF_8); + try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jFile))) { + addJarEntry(jos, "config.yml", configYml); + } + + addon = new Bank(); + addon.setDataFolder(new File("addons/Bank")); + addon.setFile(jFile); + AddonDescription desc = new AddonDescription.Builder("bentobox", "Bank", "1.3").description("test") + .authors("tastybento").build(); + addon.setDescription(desc); } - @AfterClass - public static void cleanUp() throws Exception { + @Override + @AfterEach + public void tearDown() throws Exception { + if (mockDb != null) { + mockDb.closeOnDemand(); + } + super.tearDown(); new File("addon.jar").delete(); new File("config.yml").delete(); deleteAll(new File("addons")); } - private static void deleteAll(File file) throws IOException { - if (file.exists()) { - Files.walk(file.toPath()) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - } + private static void addJarEntry(JarOutputStream jos, String name, String content) throws Exception { + JarEntry entry = new JarEntry(name); + jos.putNextEntry(entry); + jos.write(content.getBytes(StandardCharsets.UTF_8)); + jos.closeEntry(); } @Test - public void testOnEnableNoVault() { + void testOnEnableNoVault() { when(plugin.getVault()).thenReturn(Optional.empty()); addon.onEnable(); verify(plugin).logError("[Bank] Vault is required - disabling Bank - please install the Vault plugin"); } @Test - public void testOnEnableNoPlaceholderManager() { + void testOnEnableNoPlaceholderManager() { when(plugin.getPlaceholdersManager()).thenReturn(null); addon.onEnable(); verify(plugin).log("[Bank] Hooking into BSkyBlock"); @@ -268,7 +147,7 @@ public void testOnEnableNoPlaceholderManager() { } @Test - public void testOnEnable() { + void testOnEnable() { addon.onEnable(); verify(plugin).log("[Bank] Hooking into BSkyBlock"); // Placeholders @@ -278,26 +157,21 @@ public void testOnEnable() { verify(phm).registerPlaceholder(eq(addon), eq("bskyblock_top_name_" + i), any()); verify(phm).registerPlaceholder(eq(addon), eq("bskyblock_top_value_" + i), any()); } - } - @Rule - public ExpectedException exceptionRule = ExpectedException.none(); - @Test - public void testGetSettings() { - exceptionRule.expect(NullPointerException.class); - exceptionRule.expectMessage("Settings not initialized?"); - addon.getSettings(); + void testGetSettings() { + NullPointerException ex = assertThrows(NullPointerException.class, () -> addon.getSettings()); + org.junit.jupiter.api.Assertions.assertEquals("Settings not initialized?", ex.getMessage()); } @Test - public void testGetVault() { + void testGetVault() { assertNull(addon.getVault()); } @Test - public void testGetBankManager() { + void testGetBankManager() { assertNull(addon.getBankManager()); } diff --git a/src/test/java/world/bentobox/bank/CommonTestSetup.java b/src/test/java/world/bentobox/bank/CommonTestSetup.java new file mode 100644 index 0000000..1393916 --- /dev/null +++ b/src/test/java/world/bentobox/bank/CommonTestSetup.java @@ -0,0 +1,221 @@ +package world.bentobox.bank; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Optional; +import java.util.UUID; +import java.util.logging.Logger; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Player.Spigot; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.util.Vector; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import com.google.common.collect.ImmutableSet; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.user.Notifier; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.database.objects.Players; +import world.bentobox.bentobox.managers.BlueprintsManager; +import world.bentobox.bentobox.managers.FlagsManager; +import world.bentobox.bentobox.managers.HooksManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.LocalesManager; +import world.bentobox.bentobox.managers.PlaceholdersManager; +import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.util.Util; + +/** + * Common test setup for Bank tests. Call super.setUp() in subclass @BeforeEach. + */ +public abstract class CommonTestSetup { + + protected UUID uuid = UUID.randomUUID(); + + @Mock + protected Player mockPlayer; + @Mock + protected PluginManager pim; + @Mock + protected ItemFactory itemFactory; + @Mock + protected Location location; + @Mock + protected World world; + @Mock + protected IslandWorldManager iwm; + @Mock + protected IslandsManager im; + @Mock + protected Island island; + @Mock + protected BentoBox plugin; + @Mock + protected PlayerInventory inv; + @Mock + protected Notifier notifier; + @Mock + protected FlagsManager fm; + @Mock + protected Spigot spigot; + @Mock + protected HooksManager hooksManager; + @Mock + protected BlueprintsManager bm; + @Mock + protected BukkitScheduler sch; + @Mock + protected LocalesManager lm; + @Mock + protected PlaceholdersManager phm; + + protected ServerMock server; + protected MockedStatic mockedBukkit; + protected MockedStatic mockedUtil; + protected AutoCloseable closeable; + + @BeforeEach + @SuppressWarnings("java:S1130") + public void setUp() throws Exception { + closeable = MockitoAnnotations.openMocks(this); + server = MockBukkit.mock(); + + // Inject BentoBox singleton + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + + // Force Tag static fields to initialise under the real server + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; + + // Static Bukkit mock + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getMinecraftVersion).thenReturn("1.21.10"); + mockedBukkit.when(Bukkit::getBukkitVersion).thenReturn(""); + mockedBukkit.when(Bukkit::getPluginManager).thenReturn(pim); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(itemFactory); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getScheduler).thenReturn(sch); + + // Location + when(location.getWorld()).thenReturn(world); + when(location.getBlockX()).thenReturn(0); + when(location.getBlockY()).thenReturn(0); + when(location.getBlockZ()).thenReturn(0); + when(location.toVector()).thenReturn(new Vector(0, 0, 0)); + when(location.clone()).thenReturn(location); + + // PlayersManager + PlayersManager pm = mock(PlayersManager.class); + when(plugin.getPlayers()).thenReturn(pm); + Players players = mock(Players.class); + when(players.getMetaData()).thenReturn(Optional.empty()); + when(pm.getPlayer(any(UUID.class))).thenReturn(players); + + // Player + when(mockPlayer.getUniqueId()).thenReturn(uuid); + when(mockPlayer.getLocation()).thenReturn(location); + when(mockPlayer.getWorld()).thenReturn(world); + when(mockPlayer.getName()).thenReturn("tastybento"); + when(mockPlayer.getInventory()).thenReturn(inv); + when(mockPlayer.spigot()).thenReturn(spigot); + when(mockPlayer.getType()).thenReturn(EntityType.PLAYER); + + User.setPlugin(plugin); + User.clearUsers(); + User.getInstance(mockPlayer); + + // IWM + when(plugin.getIWM()).thenReturn(iwm); + when(iwm.inWorld(any(Location.class))).thenReturn(true); + when(iwm.inWorld(any(World.class))).thenReturn(true); + when(iwm.getFriendlyName(any())).thenReturn("Bank"); + when(iwm.getAddon(any())).thenReturn(Optional.empty()); + + // WorldSettings + WorldSettings worldSet = new TestWorldSettings(); + when(iwm.getWorldSettings(any())).thenReturn(worldSet); + + // IslandsManager + when(plugin.getIslands()).thenReturn(im); + when(im.getProtectedIslandAt(any())).thenReturn(Optional.of(island)); + when(island.isAllowed(any())).thenReturn(false); + when(island.isAllowed(any(User.class), any())).thenReturn(false); + when(island.getOwner()).thenReturn(uuid); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(uuid)); + + // Locales & Placeholders + when(lm.get(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + when(plugin.getPlaceholdersManager()).thenReturn(phm); + when(phm.replacePlaceholders(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + when(plugin.getLocalesManager()).thenReturn(lm); + + // Notifier + when(plugin.getNotifier()).thenReturn(notifier); + + // Logger — Addon.getLogger() delegates to plugin.getLogger() + when(plugin.getLogger()).thenReturn(Logger.getLogger("Bank-test")); + + // BentoBox settings + world.bentobox.bentobox.Settings settings = new world.bentobox.bentobox.Settings(); + when(plugin.getSettings()).thenReturn(settings); + + // Util static mock + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(mock(World.class)); + Util.setPlugin(plugin); + mockedUtil.when(() -> Util.findFirstMatchingEnum(any(), any())).thenCallRealMethod(); + + // Hooks + when(hooksManager.getHook(anyString())).thenReturn(Optional.empty()); + when(plugin.getHooks()).thenReturn(hooksManager); + + // BlueprintsManager + when(plugin.getBlueprintsManager()).thenReturn(bm); + } + + @AfterEach + public void tearDown() throws Exception { + mockedBukkit.closeOnDemand(); + mockedUtil.closeOnDemand(); + closeable.close(); + MockBukkit.unmock(); + User.clearUsers(); + Mockito.framework().clearInlineMocks(); + deleteAll(new File("database")); + deleteAll(new File("database_backup")); + } + + protected static void deleteAll(File file) throws IOException { + if (file.exists()) { + Files.walk(file.toPath()).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + } +} diff --git a/src/test/java/world/bentobox/bank/PhManagerTest.java b/src/test/java/world/bentobox/bank/PhManagerTest.java index e31100c..6819ce8 100644 --- a/src/test/java/world/bentobox/bank/PhManagerTest.java +++ b/src/test/java/world/bentobox/bank/PhManagerTest.java @@ -1,8 +1,8 @@ package world.bentobox.bank; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; @@ -17,18 +17,16 @@ import java.util.Optional; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import world.bentobox.bank.data.AccountHistory; import world.bentobox.bank.data.Money; @@ -37,7 +35,6 @@ import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.DatabaseSetup; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; import world.bentobox.bentobox.managers.IslandsManager; @@ -48,9 +45,9 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, DatabaseSetup.class, IslandsManager.class }) -public class PhManagerTest { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class PhManagerTest { // Class under test private PhManager pm; @@ -78,11 +75,8 @@ public class PhManagerTest { @Mock private PlayersManager plm; - @Before + @BeforeEach public void setUp() { - - PowerMockito.mockStatic(IslandsManager.class, Mockito.RETURNS_MOCKS); - AddonDescription desc = new AddonDescription.Builder("main", "AcidIsland", "1.0.2").build(); when(gm.getDescription()).thenReturn(desc); when(addon.getPlugin()).thenReturn(plugin); @@ -119,16 +113,16 @@ public void setUp() { * Test method for {@link world.bentobox.bank.PhManager#registerPlaceholders(world.bentobox.bentobox.api.addons.GameModeAddon)}. */ @Test - public void testRegisterPlaceholdersNoPHM() { + void testRegisterPlaceholdersNoPHM() { when(plugin.getPlaceholdersManager()).thenReturn(null); assertFalse(pm.registerPlaceholders(gm)); - } + /** * Test method for {@link world.bentobox.bank.PhManager#registerPlaceholders(world.bentobox.bentobox.api.addons.GameModeAddon)}. */ @Test - public void testRegisterPlaceholders() { + void testRegisterPlaceholders() { assertTrue(pm.registerPlaceholders(gm)); verify(phm).registerPlaceholder(eq(addon), eq("acidisland_island_balance"), any()); for (int i = 1; i < 11; i++) { @@ -140,10 +134,10 @@ public void testRegisterPlaceholders() { } /** - * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}. + * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User, boolean, boolean)}. */ @Test - public void testGetVisitedIslandBalanceWrongWorld() { + void testGetVisitedIslandBalanceWrongWorld() { when(gm.inWorld(world)).thenReturn(false); assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, false, false)); assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, true, false)); @@ -152,10 +146,10 @@ public void testGetVisitedIslandBalanceWrongWorld() { } /** - * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}. + * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User, boolean, boolean)}. */ @Test - public void testGetVisitedIslandBalanceNoIsland() { + void testGetVisitedIslandBalanceNoIsland() { when(im.getIslandAt(location)).thenReturn(Optional.empty()); assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, false, false)); assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, true, false)); @@ -164,10 +158,10 @@ public void testGetVisitedIslandBalanceNoIsland() { } /** - * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}. + * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User, boolean, boolean)}. */ @Test - public void testGetVisitedIslandBalance() { + void testGetVisitedIslandBalance() { assertEquals("$1234.56", pm.getVisitedIslandBalance(gm, user, false, false)); assertEquals("1.2k", pm.getVisitedIslandBalance(gm, user, true, false)); assertEquals("1234.56", pm.getVisitedIslandBalance(gm, user, false, true)); @@ -175,39 +169,38 @@ public void testGetVisitedIslandBalance() { } /** - * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}. + * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User, boolean, boolean)}. */ @Test - public void testGetVisitedIslandBalanceLargest() { + void testGetVisitedIslandBalanceLargest() { when(bm.getBalance(island)).thenReturn(new Money(Double.MAX_VALUE)); assertEquals("9223372T", pm.getVisitedIslandBalance(gm, user, true, false)); assertEquals("1.7976931348623157E308", pm.getVisitedIslandBalance(gm, user, true, true)); } /** - * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}. + * Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User, boolean, boolean)}. */ @Test - public void testGetVisitedIslandBalanceBig() { + void testGetVisitedIslandBalanceBig() { when(bm.getBalance(island)).thenReturn(new Money(123456789D)); assertEquals("123.5M", pm.getVisitedIslandBalance(gm, user, true, false)); assertEquals("1.23456789E8", pm.getVisitedIslandBalance(gm, user, true, true)); } - /** * Test method for {@link world.bentobox.bank.PhManager#getRankName(org.bukkit.World, int)}. */ @Test - public void testGetRankNameSub0() { - assertEquals("",pm.getRankName(world, -1)); + void testGetRankNameSub0() { + assertEquals("", pm.getRankName(world, -1)); } /** * Test method for {@link world.bentobox.bank.PhManager#getRankName(org.bukkit.World, int)}. */ @Test - public void testGetRankNameOverMax() { + void testGetRankNameOverMax() { assertEquals("", pm.getRankName(world, 100)); } @@ -215,7 +208,7 @@ public void testGetRankNameOverMax() { * Test method for {@link world.bentobox.bank.PhManager#getRankName(org.bukkit.World, int)}. */ @Test - public void testGetRankNameNone() { + void testGetRankNameNone() { for (int i = 1; i < 11; i++) { assertEquals("", pm.getRankName(world, i)); } @@ -225,7 +218,7 @@ public void testGetRankNameNone() { * Test method for {@link world.bentobox.bank.PhManager#getRankName(org.bukkit.World, int)}. */ @Test - public void testGetRankName() { + void testGetRankName() { assertEquals("", pm.getRankName(world, 5)); } @@ -233,7 +226,7 @@ public void testGetRankName() { * Test method for {@link world.bentobox.bank.PhManager#getRankIsland(org.bukkit.World, int)}. */ @Test - public void testGetRankIsland() { + void testGetRankIsland() { assertEquals("", pm.getRankIsland(world, 5)); } @@ -241,24 +234,24 @@ public void testGetRankIsland() { * Test method for {@link world.bentobox.bank.PhManager#getRankBalance(org.bukkit.World, int)}. */ @Test - public void testGetRankBalance() { + void testGetRankBalance() { assertEquals("", pm.getRankBalance(world, 5)); } /** - * Test method for {@link world.bentobox.bank.PhManager#checkCache(World, int)}. + * Test method for {@link world.bentobox.bank.PhManager#checkCache(org.bukkit.World, int)}. */ @Test - public void testCheckCache() { + void testCheckCache() { assertEquals(5, pm.checkCache(world, 5)); verify(bm).getBalances(world); } /** - * Test method for {@link world.bentobox.bank.PhManager#checkCache(World, int)}. + * Test method for {@link world.bentobox.bank.PhManager#checkCache(org.bukkit.World, int)}. */ @Test - public void testCheckCacheWithBalances() { + void testCheckCacheWithBalances() { map.put(UUID.randomUUID().toString(), new Money(123.45)); map.put(UUID.randomUUID().toString(), new Money(1230.45)); map.put(UUID.randomUUID().toString(), new Money(12300.45)); @@ -275,26 +268,26 @@ public void testCheckCacheWithBalances() { when(bm.getBalances(world)).thenReturn(map); for (int i = 1; i < 11; i++) { pm.checkCache(world, i); - assertEquals(pm.getBalances().get(i-1), "$" + map.get(pm.getNames().get(i - 1)).getValue()); - assertEquals(pm.getBalances().get(i-1), "$" + map.get(pm.getIslands().get(i - 1)).getValue()); + assertEquals(pm.getBalances().get(i - 1), "$" + map.get(pm.getNames().get(i - 1)).getValue()); + assertEquals(pm.getBalances().get(i - 1), "$" + map.get(pm.getIslands().get(i - 1)).getValue()); } } /** - * Test method for {@link world.bentobox.bank.PhManager#checkCache(World, int)}. + * Test method for {@link world.bentobox.bank.PhManager#checkCache(org.bukkit.World, int)}. */ @Test - public void testCheckCacheNoNamesChange() { + void testCheckCacheNoNamesChange() { pm.setLastSorted(System.currentTimeMillis() + 10000); assertEquals(5, pm.checkCache(world, 5)); verify(bm).getBalances(world); } /** - * Test method for {@link world.bentobox.bank.PhManager#checkCache(World, int)}. + * Test method for {@link world.bentobox.bank.PhManager#checkCache(org.bukkit.World, int)}. */ @Test - public void testCheckCacheNoChange() { + void testCheckCacheNoChange() { // Cache should not refresh because there is a name and the time is in the future pm.setNames(Collections.singletonList("tastybento")); pm.setLastSorted(System.currentTimeMillis() + 10000); @@ -304,10 +297,10 @@ public void testCheckCacheNoChange() { } /** - * Test method for {@link world.bentobox.bank.PhManager#registerPlaceholders(world.bentobox.bentobox.api.addons.GameModeAddon)}. + * Test method for {@link world.bentobox.bank.PhManager#checkCache(org.bukkit.World, int)}. */ @Test - public void testCheckCacheOutOfBounds() { + void testCheckCacheOutOfBounds() { assertEquals(1, pm.checkCache(world, 0)); assertEquals(10, pm.checkCache(world, 100)); } @@ -316,7 +309,7 @@ public void testCheckCacheOutOfBounds() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionDeposit() { + void testGetLatestTransactionDeposit() { AccountHistory ah = new AccountHistory(System.currentTimeMillis(), "tastybento", 500.0, TxType.DEPOSIT); when(bm.getLatestHistory(eq(island))).thenReturn(ah); assertEquals("tastybento Deposited $500.0", pm.getLatestTransaction(user, world)); @@ -326,7 +319,7 @@ public void testGetLatestTransactionDeposit() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionWithdraw() { + void testGetLatestTransactionWithdraw() { AccountHistory ah = new AccountHistory(System.currentTimeMillis(), "tastybento", 200.0, TxType.WITHDRAW); when(bm.getLatestHistory(eq(island))).thenReturn(ah); assertEquals("tastybento Withdrew $200.0", pm.getLatestTransaction(user, world)); @@ -336,7 +329,7 @@ public void testGetLatestTransactionWithdraw() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionNoHistory() { + void testGetLatestTransactionNoHistory() { when(bm.getLatestHistory(eq(island))).thenReturn(null); assertEquals("", pm.getLatestTransaction(user, world)); } @@ -345,7 +338,7 @@ public void testGetLatestTransactionNoHistory() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionNoIsland() { + void testGetLatestTransactionNoIsland() { when(im.getIsland(any(World.class), any(User.class))).thenReturn(null); assertEquals("", pm.getLatestTransaction(user, world)); } @@ -354,7 +347,7 @@ public void testGetLatestTransactionNoIsland() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionNullUser() { + void testGetLatestTransactionNullUser() { assertEquals("", pm.getLatestTransaction(null, world)); } @@ -362,7 +355,7 @@ public void testGetLatestTransactionNullUser() { * Test method for {@link world.bentobox.bank.PhManager#getLatestTransaction(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. */ @Test - public void testGetLatestTransactionNotPlayer() { + void testGetLatestTransactionNotPlayer() { when(user.isPlayer()).thenReturn(false); assertEquals("", pm.getLatestTransaction(user, world)); } @@ -372,7 +365,7 @@ public void testGetLatestTransactionNotPlayer() { * Verifies that the latest_transaction placeholder is registered. */ @Test - public void testRegisterPlaceholdersLatestTransaction() { + void testRegisterPlaceholdersLatestTransaction() { assertTrue(pm.registerPlaceholders(gm)); verify(phm).registerPlaceholder(eq(addon), eq("acidisland_latest_transaction"), any()); } diff --git a/src/test/java/world/bentobox/bank/TestWorldSettings.java b/src/test/java/world/bentobox/bank/TestWorldSettings.java new file mode 100644 index 0000000..0ce8699 --- /dev/null +++ b/src/test/java/world/bentobox/bank/TestWorldSettings.java @@ -0,0 +1,345 @@ +package world.bentobox.bank; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.bukkit.Difficulty; +import org.bukkit.GameMode; +import org.bukkit.entity.EntityType; +import org.eclipse.jdt.annotation.NonNull; + +import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.flags.Flag; + +/** + * Minimal WorldSettings implementation for use in tests. + */ +public class TestWorldSettings implements WorldSettings { + + private long epoch; + + @Override + public GameMode getDefaultGameMode() { + return GameMode.SURVIVAL; + } + + @SuppressWarnings("removal") + @Override + public Map getDefaultIslandFlags() { + return Collections.emptyMap(); + } + + @SuppressWarnings("removal") + @Override + public Map getDefaultIslandSettings() { + return Collections.emptyMap(); + } + + @Override + public Difficulty getDifficulty() { + return Difficulty.NORMAL; + } + + @Override + public void setDifficulty(Difficulty difficulty) { + // unused + } + + @Override + public String getFriendlyName() { + return "Bank"; + } + + @Override + public int getIslandDistance() { + return 0; + } + + @Override + public int getIslandHeight() { + return 0; + } + + @Override + public int getIslandProtectionRange() { + return 0; + } + + @Override + public int getIslandStartX() { + return 0; + } + + @Override + public int getIslandStartZ() { + return 0; + } + + @Override + public int getIslandXOffset() { + return 0; + } + + @Override + public int getIslandZOffset() { + return 0; + } + + @Override + public List getIvSettings() { + return Collections.emptyList(); + } + + @Override + public int getMaxHomes() { + return 3; + } + + @Override + public int getMaxIslands() { + return 0; + } + + @Override + public int getMaxTeamSize() { + return 4; + } + + @Override + public int getNetherSpawnRadius() { + return 10; + } + + @Override + public String getPermissionPrefix() { + return "bank."; + } + + @Override + public Set getRemoveMobsWhitelist() { + return Collections.emptySet(); + } + + @Override + public int getSeaHeight() { + return 0; + } + + @Override + public List getHiddenFlags() { + return Collections.emptyList(); + } + + @Override + public List getVisitorBannedCommands() { + return Collections.emptyList(); + } + + @Override + public Map getWorldFlags() { + return new HashMap<>(); + } + + @Override + public String getWorldName() { + return "bank-world"; + } + + @Override + public boolean isDragonSpawn() { + return false; + } + + @Override + public boolean isEndGenerate() { + return true; + } + + @Override + public boolean isEndIslands() { + return true; + } + + @Override + public boolean isNetherGenerate() { + return true; + } + + @Override + public boolean isNetherIslands() { + return true; + } + + @Override + public boolean isOnJoinResetEnderChest() { + return false; + } + + @Override + public boolean isOnJoinResetInventory() { + return false; + } + + @Override + public boolean isOnJoinResetMoney() { + return false; + } + + @Override + public boolean isOnJoinResetHealth() { + return false; + } + + @Override + public boolean isOnJoinResetHunger() { + return false; + } + + @Override + public boolean isOnJoinResetXP() { + return false; + } + + @Override + public @NonNull List getOnJoinCommands() { + return Collections.emptyList(); + } + + @Override + public boolean isOnLeaveResetEnderChest() { + return false; + } + + @Override + public boolean isOnLeaveResetInventory() { + return false; + } + + @Override + public boolean isOnLeaveResetMoney() { + return false; + } + + @Override + public boolean isOnLeaveResetHealth() { + return false; + } + + @Override + public boolean isOnLeaveResetHunger() { + return false; + } + + @Override + public boolean isOnLeaveResetXP() { + return false; + } + + @Override + public @NonNull List getOnLeaveCommands() { + return Collections.emptyList(); + } + + @Override + public boolean isUseOwnGenerator() { + return false; + } + + @Override + public boolean isWaterUnsafe() { + return false; + } + + @Override + public List getGeoLimitSettings() { + return Collections.emptyList(); + } + + @Override + public int getResetLimit() { + return 0; + } + + @Override + public long getResetEpoch() { + return epoch; + } + + @Override + public void setResetEpoch(long timestamp) { + this.epoch = timestamp; + } + + @Override + public boolean isTeamJoinDeathReset() { + return false; + } + + @Override + public int getDeathsMax() { + return 0; + } + + @Override + public boolean isDeathsCounted() { + return true; + } + + @Override + public boolean isDeathsResetOnNewIsland() { + return true; + } + + @Override + public boolean isAllowSetHomeInNether() { + return false; + } + + @Override + public boolean isAllowSetHomeInTheEnd() { + return false; + } + + @Override + public boolean isRequireConfirmationToSetHomeInNether() { + return false; + } + + @Override + public boolean isRequireConfirmationToSetHomeInTheEnd() { + return false; + } + + @Override + public int getBanLimit() { + return 10; + } + + @Override + public boolean isLeaversLoseReset() { + return true; + } + + @Override + public boolean isKickedKeepInventory() { + return true; + } + + @Override + public boolean isCreateIslandOnFirstLoginEnabled() { + return false; + } + + @Override + public int getCreateIslandOnFirstLoginDelay() { + return 0; + } + + @Override + public boolean isCreateIslandOnFirstLoginAbortOnLogout() { + return false; + } +} diff --git a/src/test/java/world/bentobox/bank/WhiteBox.java b/src/test/java/world/bentobox/bank/WhiteBox.java new file mode 100644 index 0000000..84e614c --- /dev/null +++ b/src/test/java/world/bentobox/bank/WhiteBox.java @@ -0,0 +1,13 @@ +package world.bentobox.bank; + +public class WhiteBox { + public static void setInternalState(Class targetClass, String fieldName, Object value) { + try { + java.lang.reflect.Field field = targetClass.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(null, value); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Failed to set static field '" + fieldName + "' on class " + targetClass.getName(), e); + } + } +} diff --git a/src/test/java/world/bentobox/bank/commands/admin/AdminBalanceCommandTest.java b/src/test/java/world/bentobox/bank/commands/admin/AdminBalanceCommandTest.java index 7411ed4..85264b8 100644 --- a/src/test/java/world/bentobox/bank/commands/admin/AdminBalanceCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/admin/AdminBalanceCommandTest.java @@ -1,44 +1,31 @@ package world.bentobox.bank.commands.admin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.data.Money; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; import world.bentobox.bentobox.util.Util; @@ -46,51 +33,36 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ BentoBox.class, Util.class, Bukkit.class }) -public class AdminBalanceCommandTest { +class AdminBalanceCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private AdminBalanceCommand bc; @Mock private PlayersManager pm; + // Class under test + private AdminBalanceCommand bc; - @Before - public void setUp() { - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // Players @@ -100,39 +72,36 @@ public void setUp() { // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); EconomyResponse er = new EconomyResponse(0, 0, ResponseType.SUCCESS, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); // Default 0 balance for unknown islands when(bankManager.getBalance(any())).thenReturn(new Money()); bc = new AdminBalanceCommand(ic); } - /** * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertFalse(bc.isOnlyPlayer()); assertEquals("bank.admin.balance", bc.getPermission()); assertEquals("bank.admin.balance.parameters", bc.getParameters()); assertEquals("bank.admin.balance.description", bc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsNoArgs() { + void testCanExecuteArgsNoArgs() { assertFalse(bc.canExecute(user, "balance", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -141,7 +110,7 @@ public void testCanExecuteArgsNoArgs() { * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "balance", Collections.singletonList("tastybento"))); verify(user).sendMessage("general.errors.no-island"); @@ -151,7 +120,7 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteUnknownTarget() { + void testCanExecuteUnknownTarget() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(bc.canExecute(user, "balance", Collections.singletonList("bonne"))); verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); @@ -161,7 +130,7 @@ public void testCanExecuteUnknownTarget() { * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { // Should be ignored because this is an admin command when(island.isAllowed(eq(user), any())).thenReturn(false); assertTrue(bc.canExecute(user, "balance", Collections.singletonList("tastybento"))); @@ -171,7 +140,7 @@ public void testCanExecuteNoRank() { * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "balance", Collections.singletonList("tastybento"))); } @@ -179,10 +148,9 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.admin.AdminBalanceCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { assertTrue(bc.execute(user, "balance", Collections.singletonList("tastybento"))); verify(user).sendMessage("bank.balance.island-balance", TextVariables.NUMBER, "0.0"); } - } diff --git a/src/test/java/world/bentobox/bank/commands/admin/AdminGiveCommandTest.java b/src/test/java/world/bentobox/bank/commands/admin/AdminGiveCommandTest.java index 7d0a7ae..f351bfe 100644 --- a/src/test/java/world/bentobox/bank/commands/admin/AdminGiveCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/admin/AdminGiveCommandTest.java @@ -1,13 +1,12 @@ package world.bentobox.bank.commands.admin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -15,92 +14,69 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; import world.bentobox.bank.BankResponse; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.data.Money; import world.bentobox.bank.data.TxType; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(BentoBox.class) -public class AdminGiveCommandTest { +class AdminGiveCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private AdminGiveCommand bc; @Mock private PlayersManager pm; + // Class under test + private AdminGiveCommand bc; - @Before - public void setUp() { - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); + when(user.getName()).thenReturn("tastybento"); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // Players when(addon.getPlayers()).thenReturn(pm); when(pm.getUser("tastybento")).thenReturn(user); - when(user.getName()).thenReturn("tastybento"); // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); @@ -111,6 +87,9 @@ public void setUp() { // Default 0 balance for unknown islands when(bankManager.getBalance(any())).thenReturn(new Money()); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); + bc = new AdminGiveCommand(ic); } @@ -118,19 +97,18 @@ public void setUp() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertFalse(bc.isOnlyPlayer()); assertEquals("bank.admin.give", bc.getPermission()); assertEquals("bank.admin.give.parameters", bc.getParameters()); assertEquals("bank.admin.give.description", bc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsNoArgs() { + void testCanExecuteArgsNoArgs() { assertFalse(bc.canExecute(user, "give", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -139,7 +117,7 @@ public void testCanExecuteArgsNoArgs() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsOneArg() { + void testCanExecuteArgsOneArg() { assertFalse(bc.canExecute(user, "give", Collections.singletonList("tastybento"))); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -148,7 +126,7 @@ public void testCanExecuteArgsOneArg() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "give", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("general.errors.no-island"); @@ -158,7 +136,7 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteUnknownTarget() { + void testCanExecuteUnknownTarget() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(bc.canExecute(user, "give", Arrays.asList("bonne", "100"))); verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); @@ -168,7 +146,7 @@ public void testCanExecuteUnknownTarget() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNotANumber() { + void testCanExecuteNotANumber() { assertFalse(bc.canExecute(user, "give", Arrays.asList("tastybento", "xxx"))); verify(user).sendMessage("bank.errors.must-be-a-number"); } @@ -177,7 +155,7 @@ public void testCanExecuteNotANumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNegativeNumber() { + void testCanExecuteNegativeNumber() { assertFalse(bc.canExecute(user, "give", Arrays.asList("tastybento", "-99"))); verify(user).sendMessage("bank.errors.value-must-be-positive"); } @@ -186,7 +164,7 @@ public void testCanExecuteNegativeNumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { // Should be ignored because this is an admin command when(island.isAllowed(eq(user), any())).thenReturn(false); assertTrue(bc.canExecute(user, "give", Arrays.asList("tastybento", "100"))); @@ -196,7 +174,7 @@ public void testCanExecuteNoRank() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "give", Arrays.asList("tastybento", "100"))); } @@ -204,7 +182,7 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { assertTrue(bc.canExecute(user, "give", Arrays.asList("tastybento", "100"))); assertTrue(bc.execute(user, "give", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("bank.admin.give.success", @@ -216,7 +194,7 @@ public void testExecuteUserStringListOfString() { * Test method for {@link world.bentobox.bank.commands.admin.AdminGiveCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringError() { + void testExecuteUserStringListOfStringError() { when(bankManager.deposit(eq(user), any(), any(Money.class), eq(TxType.GIVE))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR)); assertTrue(bc.execute(user, "give", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("bank.errors.bank-error"); diff --git a/src/test/java/world/bentobox/bank/commands/admin/AdminSetCommandTest.java b/src/test/java/world/bentobox/bank/commands/admin/AdminSetCommandTest.java index 120b5ca..771f4cc 100644 --- a/src/test/java/world/bentobox/bank/commands/admin/AdminSetCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/admin/AdminSetCommandTest.java @@ -1,13 +1,12 @@ package world.bentobox.bank.commands.admin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -16,82 +15,60 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; import world.bentobox.bank.BankResponse; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.data.Money; import world.bentobox.bank.data.TxType; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(BentoBox.class) -public class AdminSetCommandTest { +class AdminSetCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private AdminSetCommand bc; @Mock private PlayersManager pm; + // Class under test + private AdminSetCommand bc; - @Before - public void setUp() { - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); when(user.getName()).thenReturn("tastybento"); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // Players @@ -101,7 +78,6 @@ public void setUp() { // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); @@ -113,6 +89,9 @@ public void setUp() { // Island when(island.getUniqueId()).thenReturn(UUID.randomUUID().toString()); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); + bc = new AdminSetCommand(ic); } @@ -120,19 +99,18 @@ public void setUp() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertFalse(bc.isOnlyPlayer()); assertEquals("bank.admin.set", bc.getPermission()); assertEquals("bank.admin.set.parameters", bc.getParameters()); assertEquals("bank.admin.set.description", bc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsNoArgs() { + void testCanExecuteArgsNoArgs() { assertFalse(bc.canExecute(user, "set", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -141,7 +119,7 @@ public void testCanExecuteArgsNoArgs() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsOneArg() { + void testCanExecuteArgsOneArg() { assertFalse(bc.canExecute(user, "set", Collections.singletonList("tastybento"))); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -150,7 +128,7 @@ public void testCanExecuteArgsOneArg() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "set", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("general.errors.no-island"); @@ -160,7 +138,7 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteUnknownTarget() { + void testCanExecuteUnknownTarget() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(bc.canExecute(user, "set", Arrays.asList("bonne", "100"))); verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); @@ -170,7 +148,7 @@ public void testCanExecuteUnknownTarget() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNotANumber() { + void testCanExecuteNotANumber() { assertFalse(bc.canExecute(user, "set", Arrays.asList("tastybento", "xxx"))); verify(user).sendMessage("bank.errors.must-be-a-number"); } @@ -179,7 +157,7 @@ public void testCanExecuteNotANumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNegativeNumber() { + void testCanExecuteNegativeNumber() { assertFalse(bc.canExecute(user, "set", Arrays.asList("tastybento", "-99"))); verify(user).sendMessage("bank.errors.value-must-be-positive"); } @@ -188,7 +166,7 @@ public void testCanExecuteNegativeNumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { // Should be ignored because this is an admin command when(island.isAllowed(eq(user), any())).thenReturn(false); assertTrue(bc.canExecute(user, "set", Arrays.asList("tastybento", "100"))); @@ -198,7 +176,7 @@ public void testCanExecuteNoRank() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "set", Arrays.asList("tastybento", "100"))); } @@ -206,7 +184,7 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { testCanExecuteSuccess(); assertTrue(bc.execute(user, "set", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("bank.admin.set.success", TextVariables.NAME, "tastybento", TextVariables.NUMBER, "100.0"); @@ -216,7 +194,7 @@ public void testExecuteUserStringListOfString() { * Test method for {@link world.bentobox.bank.commands.admin.AdminSetCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringError() { + void testExecuteUserStringListOfStringError() { testCanExecuteSuccess(); when(bankManager.set(eq(user), any(), any(), any(), eq(TxType.SET))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR)); assertTrue(bc.execute(user, "set", Arrays.asList("tastybento", "100"))); diff --git a/src/test/java/world/bentobox/bank/commands/admin/AdminStatementCommandTest.java b/src/test/java/world/bentobox/bank/commands/admin/AdminStatementCommandTest.java index 5822c17..17b9727 100644 --- a/src/test/java/world/bentobox/bank/commands/admin/AdminStatementCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/admin/AdminStatementCommandTest.java @@ -1,46 +1,32 @@ package world.bentobox.bank.commands.admin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; -import org.bukkit.Bukkit; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.Settings; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; import world.bentobox.bentobox.util.Util; @@ -48,54 +34,39 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, Util.class}) -public class AdminStatementCommandTest { +class AdminStatementCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private AdminStatementCommand bc; @Mock private PlayersManager pm; @Mock private Player player; - /** - */ - @Before - public void setUp() { - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + // Class under test + private AdminStatementCommand bc; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); when(user.getPlayer()).thenReturn(player); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // Players @@ -105,42 +76,34 @@ public void setUp() { // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); EconomyResponse er = new EconomyResponse(0, 0, ResponseType.SUCCESS, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); - // Settings - when(pluginMock.getSettings()).thenReturn(new Settings()); - - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); bc = new AdminStatementCommand(ic); } - /** * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertTrue(bc.isOnlyPlayer()); assertEquals("bank.admin.statement", bc.getPermission()); assertEquals("bank.admin.statement.parameters", bc.getParameters()); assertEquals("bank.admin.statement.description", bc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsNoArgs() { + void testCanExecuteArgsNoArgs() { assertFalse(bc.canExecute(user, "statement", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -149,7 +112,7 @@ public void testCanExecuteArgsNoArgs() { * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "statement", Collections.singletonList("tastybento"))); verify(user).sendMessage("general.errors.no-island"); @@ -159,16 +122,17 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteUnknownTarget() { + void testCanExecuteUnknownTarget() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(bc.canExecute(user, "statement", Collections.singletonList("bonne"))); - verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); } + verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); + } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { // Should be ignored because this is an admin command when(island.isAllowed(eq(user), any())).thenReturn(false); assertTrue(bc.canExecute(user, "statement", Collections.singletonList("tastybento"))); @@ -178,7 +142,7 @@ public void testCanExecuteNoRank() { * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "statement", Collections.singletonList("tastybento"))); } @@ -186,11 +150,10 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.admin.AdminStatementCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { assertTrue(bc.execute(user, "statement", Collections.singletonList("tastybento"))); verify(user).closeInventory(); verify(player).openInventory(any(Inventory.class)); } - } diff --git a/src/test/java/world/bentobox/bank/commands/admin/AdminTakeCommandTest.java b/src/test/java/world/bentobox/bank/commands/admin/AdminTakeCommandTest.java index 0cb94fe..4d80807 100644 --- a/src/test/java/world/bentobox/bank/commands/admin/AdminTakeCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/admin/AdminTakeCommandTest.java @@ -1,13 +1,12 @@ package world.bentobox.bank.commands.admin; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -15,93 +14,69 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; import world.bentobox.bank.BankResponse; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.data.Money; import world.bentobox.bank.data.TxType; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(BentoBox.class) -public class AdminTakeCommandTest { +class AdminTakeCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private AdminTakeCommand bc; @Mock private PlayersManager pm; - /** - */ - @Before - public void setUp() { - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + // Class under test + private AdminTakeCommand bc; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); + when(user.getName()).thenReturn("tastybento"); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); // Players when(addon.getPlayers()).thenReturn(pm); when(pm.getUser("tastybento")).thenReturn(user); - when(user.getName()).thenReturn("tastybento"); // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); @@ -112,6 +87,9 @@ public void setUp() { // set default balance to 0 for unknown island when(bankManager.getBalance(any())).thenReturn(new Money()); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); + bc = new AdminTakeCommand(ic); } @@ -119,19 +97,18 @@ public void setUp() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertFalse(bc.isOnlyPlayer()); assertEquals("bank.admin.take", bc.getPermission()); assertEquals("bank.admin.take.parameters", bc.getParameters()); assertEquals("bank.admin.take.description", bc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsNoArgs() { + void testCanExecuteArgsNoArgs() { assertFalse(bc.canExecute(user, "take", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -140,7 +117,7 @@ public void testCanExecuteArgsNoArgs() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgsOneArg() { + void testCanExecuteArgsOneArg() { assertFalse(bc.canExecute(user, "take", Collections.singletonList("tastybento"))); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -149,7 +126,7 @@ public void testCanExecuteArgsOneArg() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "take", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("general.errors.no-island"); @@ -159,7 +136,7 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteUnknownTarget() { + void testCanExecuteUnknownTarget() { when(pm.getUser(anyString())).thenReturn(null); assertFalse(bc.canExecute(user, "take", Arrays.asList("bonne", "100"))); verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "bonne"); @@ -169,7 +146,7 @@ public void testCanExecuteUnknownTarget() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNotANumber() { + void testCanExecuteNotANumber() { assertFalse(bc.canExecute(user, "take", Arrays.asList("tastybento", "xxx"))); verify(user).sendMessage("bank.errors.must-be-a-number"); } @@ -178,7 +155,7 @@ public void testCanExecuteNotANumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNegativeNumber() { + void testCanExecuteNegativeNumber() { assertFalse(bc.canExecute(user, "take", Arrays.asList("tastybento", "-99"))); verify(user).sendMessage("bank.errors.value-must-be-positive"); } @@ -187,7 +164,7 @@ public void testCanExecuteNegativeNumber() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { // Should be ignored because this is an admin command when(island.isAllowed(eq(user), any())).thenReturn(false); assertTrue(bc.canExecute(user, "take", Arrays.asList("tastybento", "100"))); @@ -197,7 +174,7 @@ public void testCanExecuteNoRank() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "take", Arrays.asList("tastybento", "100"))); } @@ -205,7 +182,7 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { testCanExecuteSuccess(); assertTrue(bc.execute(user, "take", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("bank.admin.give.success", @@ -217,7 +194,7 @@ public void testExecuteUserStringListOfString() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringLowBalance() { + void testExecuteUserStringListOfStringLowBalance() { testCanExecuteSuccess(); when(bankManager.withdraw(eq(user), any(), any(), eq(TxType.TAKE))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOW_BALANCE)); assertTrue(bc.execute(user, "take", Arrays.asList("tastybento", "100"))); @@ -228,11 +205,10 @@ public void testExecuteUserStringListOfStringLowBalance() { * Test method for {@link world.bentobox.bank.commands.admin.AdminTakeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringError() { + void testExecuteUserStringListOfStringError() { when(bankManager.withdraw(eq(user), any(), any(), eq(TxType.TAKE))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR)); assertTrue(bc.execute(user, "take", Arrays.asList("tastybento", "100"))); verify(user).sendMessage("bank.errors.bank-error"); } - } diff --git a/src/test/java/world/bentobox/bank/commands/user/BalanceCommandTest.java b/src/test/java/world/bentobox/bank/commands/user/BalanceCommandTest.java index 5524d4e..eb6a90c 100644 --- a/src/test/java/world/bentobox/bank/commands/user/BalanceCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/user/BalanceCommandTest.java @@ -1,66 +1,43 @@ package world.bentobox.bank.commands.user; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.data.Money; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ BentoBox.class, Util.class, Bukkit.class }) -public class BalanceCommandTest { +class BalanceCommandTest extends CommonTestSetup { @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @@ -68,40 +45,32 @@ public class BalanceCommandTest { private VaultHook vh; // Class under test private BalanceCommand bc; - /** - */ - @Before - public void setUp() { - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); - // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); EconomyResponse er = new EconomyResponse(0, 0, ResponseType.SUCCESS, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); when(bankManager.getBalance(any())).thenReturn(new Money()); @@ -112,7 +81,7 @@ public void setUp() { * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertTrue(bc.isOnlyPlayer()); assertEquals("bank.user.balance", bc.getPermission()); assertEquals("bank.balance.description", bc.getDescription()); @@ -122,7 +91,7 @@ public void testSetup() { * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgs() { + void testCanExecuteArgs() { assertFalse(bc.canExecute(user, "balance", Collections.singletonList("fff"))); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -131,7 +100,7 @@ public void testCanExecuteArgs() { * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(bc.canExecute(user, "balance", Collections.emptyList())); verify(user).sendMessage("general.errors.no-island"); @@ -141,18 +110,17 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { when(island.isAllowed(eq(user), any())).thenReturn(false); assertFalse(bc.canExecute(user, "balance", Collections.emptyList())); verify(user).sendMessage("bank.errors.no-rank"); - } /** * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(bc.canExecute(user, "balance", Collections.emptyList())); } @@ -160,7 +128,7 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { assertTrue(bc.execute(user, "balance", Collections.emptyList())); verify(user).sendMessage("bank.balance.island-balance", TextVariables.NUMBER, "0.0"); } diff --git a/src/test/java/world/bentobox/bank/commands/user/DepositCommandTest.java b/src/test/java/world/bentobox/bank/commands/user/DepositCommandTest.java index b7120f5..99eef24 100644 --- a/src/test/java/world/bentobox/bank/commands/user/DepositCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/user/DepositCommandTest.java @@ -1,12 +1,11 @@ package world.bentobox.bank.commands.user; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -17,43 +16,29 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; import world.bentobox.bank.BankResponse; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.Settings; import world.bentobox.bank.data.Money; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ BentoBox.class, Util.class, Bukkit.class }) -public class DepositCommandTest { +class DepositCommandTest extends CommonTestSetup { /** * Class under test @@ -64,14 +49,6 @@ public class DepositCommandTest { @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @@ -79,30 +56,21 @@ public class DepositCommandTest { private VaultHook vh; private Settings settings; - /** - */ - @Before - public void setUp() { - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); when(user.getUniqueId()).thenReturn(UUID.randomUUID()); - // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); - // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); @@ -110,7 +78,6 @@ public void setUp() { settings = new Settings(); when(addon.getSettings()).thenReturn(settings); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(bankManager.getBalance(island)).thenReturn(new Money(100D)); when(addon.getVault()).thenReturn(vh); @@ -118,18 +85,18 @@ public void setUp() { when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); EconomyResponse er = new EconomyResponse(0, 0, ResponseType.SUCCESS, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); - dct = new DepositCommand(ic); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); + dct = new DepositCommand(ic); } /** * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertTrue(dct.isOnlyPlayer()); assertEquals("bank.user.deposit", dct.getPermission()); assertEquals("bank.deposit.parameters", dct.getParameters()); @@ -140,7 +107,7 @@ public void testSetup() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoArgs() { + void testCanExecuteNoArgs() { assertFalse(dct.canExecute(user, "deposit", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -149,7 +116,7 @@ public void testCanExecuteNoArgs() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNotANumber() { + void testCanExecuteOneArgNotANumber() { assertFalse(dct.canExecute(user, "deposit", Collections.singletonList("hello"))); verify(user).sendMessage("bank.errors.must-be-a-number"); } @@ -158,7 +125,7 @@ public void testCanExecuteOneArgNotANumber() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNegativeNumber() { + void testCanExecuteOneArgNegativeNumber() { assertFalse(dct.canExecute(user, "deposit", Collections.singletonList("-50"))); verify(user).sendMessage("bank.errors.value-must-be-positive"); } @@ -167,7 +134,7 @@ public void testCanExecuteOneArgNegativeNumber() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberNoRank() { + void testCanExecuteOneArgNumberNoRank() { when(island.isAllowed(eq(user), any())).thenReturn(false); assertFalse(dct.canExecute(user, "deposit", Collections.singletonList("123.30"))); verify(user).sendMessage("bank.errors.no-rank"); @@ -177,7 +144,7 @@ public void testCanExecuteOneArgNumberNoRank() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberNoIsland() { + void testCanExecuteOneArgNumberNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(dct.canExecute(user, "deposit", Collections.singletonList("123.30"))); verify(user).sendMessage("general.errors.no-island"); @@ -187,7 +154,7 @@ public void testCanExecuteOneArgNumberNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteAllSuccess() { + void testCanExecuteAllSuccess() { when(bankManager.getBalance(user, world)).thenReturn(new Money(555D)); assertTrue(dct.canExecute(user, "deposit", Collections.singletonList("all"))); verify(user, never()).sendMessage(any()); @@ -197,7 +164,7 @@ public void testCanExecuteAllSuccess() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberSuccess() { + void testCanExecuteOneArgNumberSuccess() { when(bankManager.getBalance(user, world)).thenReturn(new Money(555D)); assertTrue(dct.canExecute(user, "deposit", Collections.singletonList("123.30"))); verify(user, never()).sendMessage(any()); @@ -207,7 +174,7 @@ public void testCanExecuteOneArgNumberSuccess() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringLoadError() { + void testExecuteUserStringListOfStringLoadError() { when(bankManager.deposit(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR)); assertTrue(dct.execute(user, "deposit", Collections.emptyList())); @@ -218,7 +185,7 @@ public void testExecuteUserStringListOfStringLoadError() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringVaultError() { + void testExecuteUserStringListOfStringVaultError() { EconomyResponse er = new EconomyResponse(0, 0, ResponseType.FAILURE, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); assertFalse(dct.execute(user, "deposit", Collections.emptyList())); @@ -229,7 +196,7 @@ public void testExecuteUserStringListOfStringVaultError() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringLowBalance() { + void testExecuteUserStringListOfStringLowBalance() { when(bankManager.deposit(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOW_BALANCE)); assertTrue(dct.execute(user, "deposit", Collections.emptyList())); @@ -240,7 +207,7 @@ public void testExecuteUserStringListOfStringLowBalance() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringNoIsland() { + void testExecuteUserStringListOfStringNoIsland() { when(bankManager.deposit(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_NO_ISLAND)); assertTrue(dct.execute(user, "deposit", Collections.emptyList())); verify(user).sendMessage("general.errors.no-island"); @@ -250,7 +217,7 @@ public void testExecuteUserStringListOfStringNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringSuccess() { + void testExecuteUserStringListOfStringSuccess() { testCanExecuteOneArgNumberSuccess(); when(bankManager.deposit(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.SUCCESS)); assertTrue(dct.execute(user, "deposit", Collections.singletonList("123.30"))); @@ -262,17 +229,17 @@ public void testExecuteUserStringListOfStringSuccess() { * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberLowBalance() { + void testCanExecuteOneArgNumberLowBalance() { when(bankManager.deposit(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOW_BALANCE)); assertTrue(dct.execute(user, "deposit", Collections.singletonList("123.30"))); verify(user).sendMessage("bank.errors.low-balance"); } /** - * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#tabComplete(User, String, java.util.List) + * Test method for {@link world.bentobox.bank.commands.user.DepositCommand#tabComplete(User, String, java.util.List)}. */ @Test - public void testTabComplete() { + void testTabComplete() { Optional> value = dct.tabComplete(user, "", Collections.emptyList()); assertTrue(value.isPresent()); assertEquals("1000.0", value.get().get(0)); diff --git a/src/test/java/world/bentobox/bank/commands/user/StatementCommandTest.java b/src/test/java/world/bentobox/bank/commands/user/StatementCommandTest.java index 77df048..9bb7ca8 100644 --- a/src/test/java/world/bentobox/bank/commands/user/StatementCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/user/StatementCommandTest.java @@ -1,115 +1,80 @@ package world.bentobox.bank.commands.user; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; -import org.bukkit.Bukkit; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse.ResponseType; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.Settings; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, Util.class}) -public class StatementCommandTest { +class StatementCommandTest extends CommonTestSetup { + @Mock private CompositeCommand ic; @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @Mock private VaultHook vh; - // Class under test - private StatementCommand sc; @Mock private Player player; + // Class under test + private StatementCommand sc; - /** - */ - @Before - public void setUp() { - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); when(user.getPlayer()).thenReturn(player); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); - // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); EconomyResponse er = new EconomyResponse(0, 0, ResponseType.SUCCESS, ""); when(vh.withdraw(eq(user), anyDouble(), eq(world))).thenReturn(er); - // Settings - when(pluginMock.getSettings()).thenReturn(new Settings()); - - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); sc = new StatementCommand(ic); } @@ -118,18 +83,17 @@ public void setUp() { * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertTrue(sc.isOnlyPlayer()); assertEquals("bank.user.statement", sc.getPermission()); assertEquals("bank.statement.description", sc.getDescription()); - } /** * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteArgs() { + void testCanExecuteArgs() { assertFalse(sc.canExecute(user, "statement", Collections.singletonList("fff"))); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -138,7 +102,7 @@ public void testCanExecuteArgs() { * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoIsland() { + void testCanExecuteNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(sc.canExecute(user, "statement", Collections.emptyList())); verify(user).sendMessage("general.errors.no-island"); @@ -148,18 +112,17 @@ public void testCanExecuteNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoRank() { + void testCanExecuteNoRank() { when(island.isAllowed(eq(user), any())).thenReturn(false); assertFalse(sc.canExecute(user, "statement", Collections.emptyList())); verify(user).sendMessage("bank.errors.no-rank"); - } /** * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteSuccess() { + void testCanExecuteSuccess() { assertTrue(sc.canExecute(user, "statement", Collections.emptyList())); } @@ -167,7 +130,7 @@ public void testCanExecuteSuccess() { * Test method for {@link world.bentobox.bank.commands.user.StatementCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfString() { + void testExecuteUserStringListOfString() { assertTrue(sc.execute(user, "statement", Collections.emptyList())); verify(user).closeInventory(); verify(player).openInventory(any(Inventory.class)); diff --git a/src/test/java/world/bentobox/bank/commands/user/WithdrawCommandTest.java b/src/test/java/world/bentobox/bank/commands/user/WithdrawCommandTest.java index aaa9969..b51c7a4 100644 --- a/src/test/java/world/bentobox/bank/commands/user/WithdrawCommandTest.java +++ b/src/test/java/world/bentobox/bank/commands/user/WithdrawCommandTest.java @@ -1,11 +1,11 @@ package world.bentobox.bank.commands.user; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -16,41 +16,27 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import world.bentobox.bank.Bank; import world.bentobox.bank.BankManager; import world.bentobox.bank.BankResponse; +import world.bentobox.bank.CommonTestSetup; import world.bentobox.bank.Settings; import world.bentobox.bank.data.Money; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ BentoBox.class, Util.class, Bukkit.class }) -public class WithdrawCommandTest { +class WithdrawCommandTest extends CommonTestSetup { /** * Class under test @@ -61,14 +47,6 @@ public class WithdrawCommandTest { @Mock private User user; @Mock - private World world; - @Mock - private BentoBox plugin; - @Mock - private IslandsManager im; - @Mock - private @Nullable Island island; - @Mock private Bank addon; @Mock private BankManager bankManager; @@ -76,30 +54,21 @@ public class WithdrawCommandTest { private VaultHook vh; private Settings settings; - - /** - */ - @Before - public void setUp() { - PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); - // Set up plugin - BentoBox pluginMock = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", pluginMock); + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); when(ic.getWorld()).thenReturn(world); + when(ic.getAddon()).thenReturn(addon); when(user.getWorld()).thenReturn(world); when(user.getUniqueId()).thenReturn(UUID.randomUUID()); // IWM friendly name - IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); - when(pluginMock.getIWM()).thenReturn(iwm); - when(iwm.inWorld(any(World.class))).thenReturn(true); // Islands - when(pluginMock.getIslands()).thenReturn(im); when(im.getIsland(world, user)).thenReturn(island); - // Island flag allowed when(island.isAllowed(eq(user), any())).thenReturn(true); @@ -107,28 +76,23 @@ public void setUp() { settings = new Settings(); when(addon.getSettings()).thenReturn(settings); - - when(ic.getAddon()).thenReturn(addon); when(addon.getBankManager()).thenReturn(bankManager); when(bankManager.getBalance(any(), any())).thenReturn(new Money()); when(bankManager.getBalance(island)).thenReturn(new Money(100D)); when(addon.getVault()).thenReturn(vh); when(vh.format(anyDouble())).thenAnswer(i -> String.valueOf(i.getArgument(0, Double.class))); - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, World.class)); - - when(ic.getWorld()).thenReturn(world); + // Util.getWorld returns the world passed in + mockedUtil.when(() -> Util.getWorld(any())).thenAnswer(arg -> arg.getArgument(0, org.bukkit.World.class)); wct = new WithdrawCommand(ic); - } /** * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#setup()}. */ @Test - public void testSetup() { + void testSetup() { assertTrue(wct.isOnlyPlayer()); assertEquals("bank.user.withdraw", wct.getPermission()); assertEquals("bank.withdraw.parameters", wct.getParameters()); @@ -139,7 +103,7 @@ public void testSetup() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteNoArgs() { + void testCanExecuteNoArgs() { assertFalse(wct.canExecute(user, "withdraw", Collections.emptyList())); verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } @@ -148,7 +112,7 @@ public void testCanExecuteNoArgs() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNotANumber() { + void testCanExecuteOneArgNotANumber() { assertFalse(wct.canExecute(user, "withdraw", Collections.singletonList("hello"))); verify(user).sendMessage("bank.errors.must-be-a-number"); } @@ -157,7 +121,7 @@ public void testCanExecuteOneArgNotANumber() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNegativeNumber() { + void testCanExecuteOneArgNegativeNumber() { assertFalse(wct.canExecute(user, "withdraw", Collections.singletonList("-50"))); verify(user).sendMessage("bank.errors.value-must-be-positive"); } @@ -166,7 +130,7 @@ public void testCanExecuteOneArgNegativeNumber() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberLowBalance() { + void testCanExecuteOneArgNumberLowBalance() { assertFalse(wct.canExecute(user, "withdraw", Collections.singletonList("123.30"))); verify(user, never()).sendMessage("bank.errors.must-be-a-number"); verify(user).sendMessage("bank.errors.low-balance"); @@ -176,7 +140,7 @@ public void testCanExecuteOneArgNumberLowBalance() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteAllArg() { + void testCanExecuteAllArg() { when(bankManager.getBalance(user, world)).thenReturn(new Money(555D)); assertTrue(wct.canExecute(user, "withdraw", Collections.singletonList("all"))); verify(user, never()).sendMessage("bank.errors.must-be-a-number"); @@ -187,7 +151,7 @@ public void testCanExecuteAllArg() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberNoRank() { + void testCanExecuteOneArgNumberNoRank() { when(island.isAllowed(eq(user), any())).thenReturn(false); assertFalse(wct.canExecute(user, "withdraw", Collections.singletonList("123.30"))); verify(user).sendMessage("bank.errors.no-rank"); @@ -197,7 +161,7 @@ public void testCanExecuteOneArgNumberNoRank() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberNoIsland() { + void testCanExecuteOneArgNumberNoIsland() { when(im.getIsland(world, user)).thenReturn(null); assertFalse(wct.canExecute(user, "withdraw", Collections.singletonList("123.30"))); verify(user).sendMessage("general.errors.no-island"); @@ -207,7 +171,7 @@ public void testCanExecuteOneArgNumberNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testCanExecuteOneArgNumberSuccess() { + void testCanExecuteOneArgNumberSuccess() { when(bankManager.getBalance(user, world)).thenReturn(new Money(555D)); assertTrue(wct.canExecute(user, "withdraw", Collections.singletonList("123.30"))); verify(user, never()).sendMessage(any()); @@ -217,7 +181,7 @@ public void testCanExecuteOneArgNumberSuccess() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringLoadError() { + void testExecuteUserStringListOfStringLoadError() { when(bankManager.withdraw(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR)); assertTrue(wct.execute(user, "withdraw", Collections.emptyList())); verify(user).sendMessage("bank.errors.bank-error"); @@ -227,7 +191,7 @@ public void testExecuteUserStringListOfStringLoadError() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringLowBalance() { + void testExecuteUserStringListOfStringLowBalance() { when(bankManager.withdraw(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_LOW_BALANCE)); assertTrue(wct.execute(user, "withdraw", Collections.emptyList())); verify(user).sendMessage("bank.errors.low-balance"); @@ -237,7 +201,7 @@ public void testExecuteUserStringListOfStringLowBalance() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringNoIsland() { + void testExecuteUserStringListOfStringNoIsland() { when(bankManager.withdraw(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.FAILURE_NO_ISLAND)); assertTrue(wct.execute(user, "withdraw", Collections.emptyList())); verify(user).sendMessage("general.errors.no-island"); @@ -247,7 +211,7 @@ public void testExecuteUserStringListOfStringNoIsland() { * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. */ @Test - public void testExecuteUserStringListOfStringSuccess() { + void testExecuteUserStringListOfStringSuccess() { testCanExecuteOneArgNumberSuccess(); when(bankManager.withdraw(eq(user), any(), eq(world))).thenReturn(CompletableFuture.completedFuture(BankResponse.SUCCESS)); assertTrue(wct.execute(user, "withdraw", Collections.singletonList("123.30"))); @@ -256,10 +220,10 @@ public void testExecuteUserStringListOfStringSuccess() { } /** - * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#tabComplete(User, String, java.util.List) + * Test method for {@link world.bentobox.bank.commands.user.WithdrawCommand#tabComplete(User, String, java.util.List)}. */ @Test - public void testTabComplete() { + void testTabComplete() { Optional> value = wct.tabComplete(user, "", Collections.emptyList()); assertTrue(value.isPresent()); assertEquals("0.0", value.get().get(0)); diff --git a/src/test/java/world/bentobox/bank/data/MoneyTest.java b/src/test/java/world/bentobox/bank/data/MoneyTest.java index f5f835a..5722f6a 100644 --- a/src/test/java/world/bentobox/bank/data/MoneyTest.java +++ b/src/test/java/world/bentobox/bank/data/MoneyTest.java @@ -1,37 +1,29 @@ package world.bentobox.bank.data; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.math.BigDecimal; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.modules.junit4.PowerMockRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; /** * @author tastybento * */ -@RunWith(PowerMockRunner.class) public class MoneyTest { Money m; - @Before + @BeforeEach public void setUp() { m = new Money(); } - @After - public void tearDown() { - // Nothing to tear down - } - /** * Test method for {@link world.bentobox.bank.data.Money#hashCode()}. */ @@ -175,17 +167,17 @@ public void testIsPositive() { /** * Test method for {@link world.bentobox.bank.data.Money#parseMoney(java.lang.String)}. */ - @Test(expected = NullPointerException.class) + @Test public void testParseMoneyNPE() { - Money.parseMoney(null); + assertThrows(NullPointerException.class, () -> Money.parseMoney(null)); } /** * Test method for {@link world.bentobox.bank.data.Money#parseMoney(java.lang.String)}. */ - @Test(expected = NumberFormatException.class) + @Test public void testParseMoneyNFE() { - Money.parseMoney("tastybento"); + assertThrows(NumberFormatException.class, () -> Money.parseMoney("tastybento")); } /** From 067f101cf2aee356b07fe9f5321df568fbe0895a Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 5 Jun 2026 18:31:37 -0700 Subject: [PATCH 3/3] Bump plugin.yml api-version to 1.21 Match the Paper 1.21.11 / Java 21 target. Co-Authored-By: Claude Opus 4.8 --- src/main/resources/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 15889a6..32ef19b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: BentoBox-Bank main: world.bentobox.bank.BankPladdon version: ${project.version}${build.number} -api-version: "1.16" +api-version: "1.21" authors: [tastybento] contributors: ["The BentoBoxWorld Community"]