diff --git a/modules/MedalCabinet/pom.xml b/modules/MedalCabinet/pom.xml
index 904e558..8909b44 100644
--- a/modules/MedalCabinet/pom.xml
+++ b/modules/MedalCabinet/pom.xml
@@ -66,6 +66,10 @@
placeholderapi
https://repo.extendedclip.com/content/repositories/placeholderapi/
+
+ helpch
+ https://repo.helpch.at/releases/
+
@@ -78,8 +82,38 @@
me.clip
placeholderapi
- 2.11.1
+ 2.11.5
provided
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.9.2
+ test
+
+
+ org.mockito
+ mockito-core
+ 5.2.0
+ test
+
+
+ org.mockito
+ mockito-inline
+ 5.2.0
+ test
+
+
+ net.bytebuddy
+ byte-buddy
+ 1.14.19
+ test
+
+
+ net.bytebuddy
+ byte-buddy-agent
+ 1.14.19
+ test
+
diff --git a/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/command/MedalShowCmd.java b/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/command/MedalShowCmd.java
index da25743..1ad6e4e 100644
--- a/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/command/MedalShowCmd.java
+++ b/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/command/MedalShowCmd.java
@@ -10,12 +10,10 @@
import org.bukkit.entity.Player;
public class MedalShowCmd implements CommandExecutor {
- private CommandSender sender;
- private String[] args;
private final String prefix = "§7[§6勋章墙§7]§7 ";
- private void printHelp() {
+ private void printHelp(CommandSender sender) {
sender.sendMessage("§e------------帮助------------");
sender.sendMessage("§a/medalshow all §2展示你全部的勋章(全服可见)");
sender.sendMessage("§a/medalshow me §2展示你全部的勋章(仅自己可见)");
@@ -23,42 +21,44 @@ private void printHelp() {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- this.sender = sender;
- this.args = args;
if (!(sender instanceof Player)) {
return false;
}
if (args.length == 0) {
- printHelp();
+ printHelp(sender);
return true;
}
if ("all".equals(args[0])) {
- showAll();
+ showAll(sender);
} else if ("me".equals(args[0])) {
- showMe();
+ showMe(sender);
}
return false;
}
- private void showAll() {
+ private void showAll(CommandSender sender) {
Bukkit.getScheduler().runTaskAsynchronously(MedalCabinet.getPlugin(), () -> {
StringBuilder stringBuilder = new StringBuilder(prefix).append("§e").append(sender.getName())
.append(" 展示了他的勋章:\n");
for (Medal medal : SQLManager.getInstance().getPlayerMedals(sender.getName())) {
stringBuilder.append(medal).append(" ");
}
- MedalCabinet.getPlugin().getServer().broadcastMessage(stringBuilder.toString());
+ Bukkit.getScheduler().runTask(MedalCabinet.getPlugin(), () -> {
+ MedalCabinet.getPlugin().getServer().broadcastMessage(stringBuilder.toString());
+ });
});
}
- private void showMe() {
+ private void showMe(CommandSender sender) {
Bukkit.getScheduler().runTaskAsynchronously(MedalCabinet.getPlugin(), () -> {
StringBuilder stringBuilder = new StringBuilder(prefix).append("§e").append(sender.getName())
.append(" 的勋章:\n");
for (Medal medal : SQLManager.getInstance().getPlayerMedals(sender.getName())) {
stringBuilder.append(medal).append(" ");
}
- sender.sendMessage(stringBuilder.toString());
+ Bukkit.getScheduler().runTask(MedalCabinet.getPlugin(), () -> {
+ sender.sendMessage(stringBuilder.toString());
+ });
});
}
diff --git a/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/sql/SQLManager.java b/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/sql/SQLManager.java
index a719230..5cdcc20 100644
--- a/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/sql/SQLManager.java
+++ b/modules/MedalCabinet/src/main/java/com/mcatk/medalcabinet/sql/SQLManager.java
@@ -15,7 +15,12 @@ public static SQLManager getInstance() {
return instance == null ? instance = new SQLManager() : instance;
}
- private SQLManager() {
+ // For testing
+ public static void setInstance(SQLManager instance) {
+ SQLManager.instance = instance;
+ }
+
+ protected SQLManager() {
connectMySQL();
}
diff --git a/modules/MedalCabinet/src/test/java/com/mcatk/medalcabinet/command/MedalShowCmdTest.java b/modules/MedalCabinet/src/test/java/com/mcatk/medalcabinet/command/MedalShowCmdTest.java
new file mode 100644
index 0000000..f2a15ec
--- /dev/null
+++ b/modules/MedalCabinet/src/test/java/com/mcatk/medalcabinet/command/MedalShowCmdTest.java
@@ -0,0 +1,105 @@
+package com.mcatk.medalcabinet.command;
+
+import com.mcatk.medalcabinet.MedalCabinet;
+import com.mcatk.medalcabinet.medal.Medal;
+import com.mcatk.medalcabinet.sql.SQLManager;
+import org.bukkit.Bukkit;
+import org.bukkit.Server;
+import org.bukkit.command.Command;
+import org.bukkit.entity.Player;
+import org.bukkit.scheduler.BukkitScheduler;
+import org.bukkit.scheduler.BukkitTask;
+import org.bukkit.plugin.Plugin;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.MockedStatic;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.*;
+
+public class MedalShowCmdTest {
+
+ private MockedStatic mockedBukkit;
+ private MockedStatic mockedSQLManagerStatic;
+ private MockedStatic mockedMedalCabinetStatic;
+ private SQLManager mockedSQLManager;
+ private MedalCabinet mockedPlugin;
+ private Server mockedServer;
+ private BukkitScheduler mockedScheduler;
+ private Player mockedPlayer;
+
+ @BeforeEach
+ public void setUp() {
+ mockedBukkit = mockStatic(Bukkit.class);
+ mockedSQLManagerStatic = mockStatic(SQLManager.class);
+ mockedMedalCabinetStatic = mockStatic(MedalCabinet.class);
+
+ mockedPlugin = mock(MedalCabinet.class);
+ mockedServer = mock(Server.class);
+ mockedScheduler = mock(BukkitScheduler.class);
+ mockedPlayer = mock(Player.class);
+ mockedSQLManager = mock(SQLManager.class);
+
+ // Setup Bukkit statics
+ mockedBukkit.when(Bukkit::getServer).thenReturn(mockedServer);
+ mockedBukkit.when(Bukkit::getScheduler).thenReturn(mockedScheduler);
+
+ // Setup SQLManager singleton
+ mockedSQLManagerStatic.when(SQLManager::getInstance).thenReturn(mockedSQLManager);
+
+ // Setup Plugin
+ mockedMedalCabinetStatic.when(MedalCabinet::getPlugin).thenReturn(mockedPlugin);
+ when(mockedPlugin.getServer()).thenReturn(mockedServer);
+
+ // Setup Player
+ when(mockedPlayer.getName()).thenReturn("TestPlayer");
+ }
+
+ @AfterEach
+ public void tearDown() {
+ mockedBukkit.close();
+ mockedSQLManagerStatic.close();
+ mockedMedalCabinetStatic.close();
+ }
+
+ @Test
+ public void testShowAll() {
+ MedalShowCmd cmd = new MedalShowCmd();
+ String[] args = {"all"};
+
+ // Mock SQL return
+ ArrayList medals = new ArrayList<>();
+ medals.add(new Medal("1", "TestMedal", "STONE", "Desc"));
+ when(mockedSQLManager.getPlayerMedals("TestPlayer")).thenReturn(medals);
+
+ // Capture the async task
+ ArgumentCaptor asyncTaskCaptor = ArgumentCaptor.forClass(Runnable.class);
+ when(mockedScheduler.runTaskAsynchronously(eq(mockedPlugin), asyncTaskCaptor.capture()))
+ .thenReturn(mock(BukkitTask.class));
+
+ // Execute command
+ cmd.onCommand(mockedPlayer, mock(Command.class), "medalshow", args);
+
+ // Run the captured async task
+ Runnable asyncTask = asyncTaskCaptor.getValue();
+ asyncTask.run();
+
+ // Verify that runTask (sync) was called
+ ArgumentCaptor syncTaskCaptor = ArgumentCaptor.forClass(Runnable.class);
+ verify(mockedScheduler).runTask(eq(mockedPlugin), syncTaskCaptor.capture());
+
+ // Run the captured sync task
+ Runnable syncTask = syncTaskCaptor.getValue();
+ syncTask.run();
+
+ // Verify broadcastMessage is called
+ verify(mockedServer).broadcastMessage(contains("TestPlayer 展示了他的勋章"));
+ }
+}