From 3533c50489d0519f76cbcd99764056833c998ea2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 9 Nov 2025 09:57:28 -0800 Subject: [PATCH] Spring-cleaning round 1: remove deprecated Player.updateInventory --- .../nossr50/listeners/InventoryListener.java | 8 -- .../nossr50/listeners/PlayerListener.java | 3 - .../com/gmail/nossr50/party/ShareHandler.java | 4 +- .../player/PlayerUpdateInventoryTask.java | 18 ----- .../runnables/skills/AlchemyBrewTask.java | 6 +- .../skills/alchemy/AlchemyPotionBrewer.java | 20 +---- .../skills/fishing/FishingManager.java | 2 - .../skills/herbalism/HerbalismManager.java | 50 +++++++------ .../nossr50/skills/taming/TamingManager.java | 1 - .../gmail/nossr50/skills/unarmed/Unarmed.java | 75 ------------------- .../skills/unarmed/UnarmedManager.java | 3 +- .../McMMOModifyBlockDropItemEventTest.java | 8 +- 12 files changed, 42 insertions(+), 156 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java delete mode 100644 src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index aabcde3d9..c42ea6e00 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ContainerMetadataUtils; @@ -270,7 +269,6 @@ public class InventoryListener implements Listener { } event.setCancelled(true); - AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleCheck(stand); return; default: @@ -294,7 +292,6 @@ public class InventoryListener implements Listener { event.setCurrentItem(cursor.clone()); event.setCursor(null); - AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleCheck(stand); } else if (click == ClickType.RIGHT) { event.setCancelled(true); @@ -308,7 +305,6 @@ public class InventoryListener implements Listener { event.setCurrentItem(one); event.setCursor(rest); - AlchemyPotionBrewer.scheduleUpdate(inventory); AlchemyPotionBrewer.scheduleCheck(stand); } } @@ -371,7 +367,6 @@ public class InventoryListener implements Listener { } event.setCancelled(true); - AlchemyPotionBrewer.scheduleUpdate(inventory); } } @@ -511,9 +506,6 @@ public class InventoryListener implements Listener { return; } } - - mcMMO.p.getFoliaLib().getScheduler() - .runAtEntity(whoClicked, new PlayerUpdateInventoryTask((Player) whoClicked)); } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 821bd8b66..85a2eee71 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -737,7 +737,6 @@ public class PlayerListener implements Listener { // Make sure the player knows what he's doing when trying to repair an enchanted item if (repairManager.checkConfirmation(true)) { repairManager.handleRepair(heldItem); - player.updateInventory(); } } /* SALVAGE CHECKS */ @@ -756,7 +755,6 @@ public class PlayerListener implements Listener { if (salvageManager.checkConfirmation(true)) { SkillUtils.removeAbilityBoostsFromInventory(player); salvageManager.handleSalvage(clickedBlock.getLocation(), heldItem); - player.updateInventory(); } } @@ -926,7 +924,6 @@ public class PlayerListener implements Listener { // Bukkit.getPluginManager().callEvent(fakeSwing); player.getInventory().getItemInMainHand() .setAmount(heldItem.getAmount() - 1); - player.updateInventory(); if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player)) { blockState.update(true); diff --git a/src/main/java/com/gmail/nossr50/party/ShareHandler.java b/src/main/java/com/gmail/nossr50/party/ShareHandler.java index a9c38d6e4..fe2efd184 100644 --- a/src/main/java/com/gmail/nossr50/party/ShareHandler.java +++ b/src/main/java/com/gmail/nossr50/party/ShareHandler.java @@ -172,10 +172,8 @@ public final class ShareHandler { } private static void awardDrop(Player winningPlayer, ItemStack drop) { - if (winningPlayer.getInventory().addItem(drop).size() != 0) { + if (!winningPlayer.getInventory().addItem(drop).isEmpty()) { winningPlayer.getWorld().dropItem(winningPlayer.getLocation(), drop); } - - winningPlayer.updateInventory(); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java deleted file mode 100644 index d5361e7ce..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gmail.nossr50.runnables.player; - -import com.gmail.nossr50.util.CancellableRunnable; -import org.bukkit.entity.Player; - -@SuppressWarnings("deprecation") -public class PlayerUpdateInventoryTask extends CancellableRunnable { - private final Player player; - - public PlayerUpdateInventoryTask(Player player) { - this.player = player; - } - - @Override - public void run() { - player.updateInventory(); - } -} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java index 2bc6a073f..576cc2ad4 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java @@ -159,13 +159,13 @@ public class AlchemyBrewTask extends CancellableRunnable { private void finish() { if (mmoPlayer == null) { // Still need to finish brewing if the player is null - AlchemyPotionBrewer.finishBrewing(brewingStand, null, false); + AlchemyPotionBrewer.finishBrewing(brewingStand, null); } else { final McMMOPlayerBrewEvent event = new McMMOPlayerBrewEvent(mmoPlayer, brewingStand); mcMMO.p.getServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { - AlchemyPotionBrewer.finishBrewing(brewingStand, mmoPlayer, false); + AlchemyPotionBrewer.finishBrewing(brewingStand, mmoPlayer); } } @@ -175,7 +175,7 @@ public class AlchemyBrewTask extends CancellableRunnable { public void finishImmediately() { this.cancel(); - AlchemyPotionBrewer.finishBrewing(brewingStand, mmoPlayer, true); + AlchemyPotionBrewer.finishBrewing(brewingStand, mmoPlayer); Alchemy.brewingStandMap.remove(brewingStand.getLocation()); } diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java index 20f241e1d..38e3657e7 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; @@ -18,11 +17,9 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.block.BrewingStand; -import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.BrewerInventory; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -164,8 +161,7 @@ public final class AlchemyPotionBrewer { ? 1 : mmoPlayer.getAlchemyManager().getTier()); } - public static void finishBrewing(BlockState brewingStand, @Nullable McMMOPlayer mmoPlayer, - boolean forced) { + public static void finishBrewing(BlockState brewingStand, @Nullable McMMOPlayer mmoPlayer) { // Check if the brewing stand block state is an actual brewing stand if (!(brewingStand instanceof BrewingStand)) { return; @@ -257,11 +253,6 @@ public final class AlchemyPotionBrewer { } } } - - // If the brewing was not forced by external conditions, schedule a new update - if (!forced) { - scheduleUpdate(inventory); - } } public static boolean transferItems(InventoryView view, int fromSlot, ClickType click) { @@ -356,13 +347,4 @@ public final class AlchemyPotionBrewer { mcMMO.p.getFoliaLib().getScheduler().runAtLocation( brewingStand.getLocation(), new AlchemyBrewCheckTask(brewingStand)); } - - public static void scheduleUpdate(Inventory inventory) { - for (HumanEntity humanEntity : inventory.getViewers()) { - if (humanEntity instanceof Player) { - mcMMO.p.getFoliaLib().getScheduler().runAtEntity(humanEntity, - new PlayerUpdateInventoryTask((Player) humanEntity)); - } - } - } } diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java index 7a5845e81..74a477045 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -596,8 +596,6 @@ public class FishingManager extends SkillManager { drop.getAmount() - 1) : null); drop.setAmount(1); } - - targetPlayer.updateInventory(); } break; diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index 4557eeabd..f415fafcd 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -4,6 +4,8 @@ import static com.gmail.nossr50.util.ItemUtils.hasItemIncludingOffHand; import static com.gmail.nossr50.util.ItemUtils.removeItemIncludingOffHand; import static com.gmail.nossr50.util.Misc.TICK_CONVERSION_FACTOR; import static com.gmail.nossr50.util.Misc.getBlockCenter; +import static com.gmail.nossr50.util.Permissions.isSubSkillEnabled; +import static com.gmail.nossr50.util.skills.RankUtils.hasUnlockedSubskill; import static com.gmail.nossr50.util.text.ConfigStringUtils.getMaterialConfigString; import static java.util.Objects.requireNonNull; @@ -30,7 +32,6 @@ import com.gmail.nossr50.util.CancellableRunnable; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.MetadataConstants; -import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.ProbabilityUtil; @@ -62,17 +63,23 @@ import org.jetbrains.annotations.NotNull; public class HerbalismManager extends SkillManager { private final static HashMap plantBreakLimits; - private static final String CACTUS_STR = "cactus"; + private static final String CACTUS_ID = "cactus"; private static final String CACTUS_FLOWER_STR = "cactus_flower"; + private static final String BAMBOO_ID = "bamboo"; + private static final String SUGAR_CANE_ID = "sugar_cane"; + private static final String KELP_ID = "kelp"; + private static final String KELP_PLANT_ID = "kelp_plant"; + private static final String CHORUS_PLANT_ID = "chorus_plant"; + private static final String SWEET_BERRY_BUSH_ID = "sweet_berry_bush"; static { plantBreakLimits = new HashMap<>(); - plantBreakLimits.put(CACTUS_STR, 3); - plantBreakLimits.put("bamboo", 20); - plantBreakLimits.put("sugar_cane", 3); - plantBreakLimits.put("kelp", 26); - plantBreakLimits.put("kelp_plant", 26); - plantBreakLimits.put("chorus_plant", 22); + plantBreakLimits.put(CACTUS_ID, 3); + plantBreakLimits.put(BAMBOO_ID, 20); + plantBreakLimits.put(SUGAR_CANE_ID, 3); + plantBreakLimits.put(KELP_ID, 26); + plantBreakLimits.put(KELP_PLANT_ID, 26); + plantBreakLimits.put(CHORUS_PLANT_ID, 22); } public HerbalismManager(McMMOPlayer mmoPlayer) { @@ -80,7 +87,7 @@ public class HerbalismManager extends SkillManager { } public boolean canGreenThumbBlock(BlockState blockState) { - if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_GREEN_THUMB)) { + if (!hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_GREEN_THUMB)) { return false; } @@ -98,7 +105,7 @@ public class HerbalismManager extends SkillManager { return false; } - if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_SHROOM_THUMB)) { + if (!hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_SHROOM_THUMB)) { return false; } @@ -110,12 +117,12 @@ public class HerbalismManager extends SkillManager { || itemType == Material.RED_MUSHROOM) && inventory.contains(Material.BROWN_MUSHROOM, 1) && inventory.contains(Material.RED_MUSHROOM, 1) - && Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_SHROOM_THUMB); + && isSubSkillEnabled(player, SubSkillType.HERBALISM_SHROOM_THUMB); } public void processBerryBushHarvesting(@NotNull BlockState blockState) { /* Check if the player is harvesting a berry bush */ - if (blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { + if (blockState.getType().toString().equalsIgnoreCase(SWEET_BERRY_BUSH_ID)) { if (mmoPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Processing sweet berry bush rewards"); } @@ -167,7 +174,7 @@ public class HerbalismManager extends SkillManager { public void run() { BlockState blockState = block.getState(); - if (blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { + if (blockState.getType().toString().equalsIgnoreCase(SWEET_BERRY_BUSH_ID)) { if (blockState.getBlockData() instanceof Ageable ageable) { if (ageable.getAge() <= 1) { @@ -180,16 +187,16 @@ public class HerbalismManager extends SkillManager { public boolean canUseHylianLuck() { - if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK)) { + if (!hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK)) { return false; } - return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK); + return isSubSkillEnabled(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK); } public boolean canActivateAbility() { - return mmoPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra( - getPlayer()); + return mmoPlayer.getToolPreparationMode(ToolType.HOE) + && Permissions.greenTerra(getPlayer()); } public boolean isGreenTerraActive() { @@ -379,8 +386,8 @@ public class HerbalismManager extends SkillManager { public void checkDoubleDropsOnBrokenPlants(Player player, Collection brokenPlants) { //Only proceed if skill unlocked and permission enabled - if (!RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) - || !Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS)) { + if (!hasUnlockedSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) + || !isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS)) { return; } @@ -470,7 +477,7 @@ public class HerbalismManager extends SkillManager { /* * Unnatural Blocks */ - //If its a Crop we need to reward XP when its fully grown + //If it's a Crop we need to reward XP when its fully grown if (isAgeableAndFullyMature(plantData) && !isBizarreAgeable(plantData)) { xpToReward += ExperienceConfig.getInstance() .getXp(PrimarySkillType.HERBALISM, brokenBlockNewState.getType()); @@ -660,7 +667,7 @@ public class HerbalismManager extends SkillManager { } private boolean isCactus(Material material) { - return material.getKey().getKey().equalsIgnoreCase(CACTUS_STR) + return material.getKey().getKey().equalsIgnoreCase(CACTUS_ID) || material.getKey().getKey().equalsIgnoreCase(CACTUS_FLOWER_STR); } @@ -799,7 +806,6 @@ public class HerbalismManager extends SkillManager { playerInventory.removeItem(new ItemStack(Material.BROWN_MUSHROOM)); playerInventory.removeItem(new ItemStack(Material.RED_MUSHROOM)); - getPlayer().updateInventory(); if (!ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.HERBALISM_SHROOM_THUMB, mmoPlayer)) { NotificationManager.sendPlayerInformation(getPlayer(), diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index d16444715..b19135fd9 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -425,7 +425,6 @@ public class TamingManager extends SkillManager { int itemAmountAfterPayingCost = itemInMainHand.getAmount() - tamingSummon.getItemAmountRequired(); itemInMainHand.setAmount(itemAmountAfterPayingCost); - player.updateInventory(); } } else { diff --git a/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java b/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java deleted file mode 100644 index d3fc7a023..000000000 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.gmail.nossr50.skills.unarmed; - -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityPickupItemEvent; -import org.bukkit.inventory.ItemStack; - -public class Unarmed { - public static double berserkDamageModifier = 1.5; - - public static void handleItemPickup(Player player, EntityPickupItemEvent event) { - ItemStack[] storageContents = player.getInventory().getStorageContents(); - ItemStack itemDrop = event.getItem().getItemStack(); - int heldItemSlotID = player.getInventory().getHeldItemSlot(); - - int amount = itemDrop.getAmount(); - boolean grabbedItem = false; - - for (int i = 0; i <= storageContents.length - 1; i++) { - if (amount <= 0) { - break; - } - - if (i == heldItemSlotID) { - continue; - } - - //EMPTY SLOT! - if (storageContents[i] == null) { - player.getInventory().setItem(i, itemDrop); - amount = 0; - grabbedItem = true; - break; - } else if (itemDrop.isSimilar(storageContents[i]) - && storageContents[i].getAmount() < storageContents[i].getMaxStackSize()) { - //If we can fit this whole itemstack into this item - if (amount + storageContents[i].getAmount() - <= storageContents[i].getMaxStackSize()) { - ItemStack modifiedAmount = storageContents[i]; - modifiedAmount.setAmount(amount + storageContents[i].getAmount()); - - player.getInventory().setItem(i, modifiedAmount); - grabbedItem = true; - amount = 0; - } else { - //Add what we can from this stack - ItemStack modifiedAmount = storageContents[i]; - int amountThatCanFit = - storageContents[i].getMaxStackSize() - storageContents[i].getAmount(); - modifiedAmount.setAmount(amountThatCanFit); - - player.getInventory().setItem(i, modifiedAmount); - - //Remove the amount we've added - grabbedItem = true; - amount -= amountThatCanFit; - } - } - } - - if (amount <= 0) { - event.getItem().remove(); //Cleanup Item - } else { - event.getItem().getItemStack().setAmount(amount); - } - - event.setCancelled(true); - - if (grabbedItem) { - SoundManager.sendSound(player, player.getLocation(), SoundType.POP); - player.updateInventory(); - } - } -} diff --git a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index 3e5d15c0e..ed6fdec79 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -29,6 +29,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; public class UnarmedManager extends SkillManager { + public static final double BERSERK_DMG_MODIFIER = 1.5; public UnarmedManager(McMMOPlayer mmoPlayer) { super(mmoPlayer, PrimarySkillType.UNARMED); @@ -163,7 +164,7 @@ public class UnarmedManager extends SkillManager { */ public double berserkDamage(double damage) { damage = - ((damage * Unarmed.berserkDamageModifier) * mmoPlayer.getAttackStrength()) - damage; + ((damage * BERSERK_DMG_MODIFIER) * mmoPlayer.getAttackStrength()) - damage; return damage; } diff --git a/src/test/java/com/gmail/nossr50/events/items/McMMOModifyBlockDropItemEventTest.java b/src/test/java/com/gmail/nossr50/events/items/McMMOModifyBlockDropItemEventTest.java index e0d0814cd..7e72fdc35 100644 --- a/src/test/java/com/gmail/nossr50/events/items/McMMOModifyBlockDropItemEventTest.java +++ b/src/test/java/com/gmail/nossr50/events/items/McMMOModifyBlockDropItemEventTest.java @@ -1,6 +1,12 @@ package com.gmail.nossr50.events.items; -import static org.junit.jupiter.api.Assertions.*; +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.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock;