diff --git a/modules/Gem/pom.xml b/modules/Gem/pom.xml
index 6476837..3a3ea6c 100644
--- a/modules/Gem/pom.xml
+++ b/modules/Gem/pom.xml
@@ -64,7 +64,7 @@
placeholderapi
- https://repo.extendedclip.com/content/repositories/placeholderapi/
+ https://repo.helpch.at/releases/
@@ -78,8 +78,20 @@
me.clip
placeholderapi
- 2.11.1
+ 2.11.5
provided
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+ org.mockito
+ mockito-core
+ 3.12.4
+ test
+
diff --git a/modules/Gem/src/main/java/com/mcatk/gem/Gem.java b/modules/Gem/src/main/java/com/mcatk/gem/Gem.java
index 3fefdd5..976a68e 100644
--- a/modules/Gem/src/main/java/com/mcatk/gem/Gem.java
+++ b/modules/Gem/src/main/java/com/mcatk/gem/Gem.java
@@ -11,7 +11,7 @@
import java.text.SimpleDateFormat;
import java.util.Date;
-public final class Gem extends JavaPlugin {
+public class Gem extends JavaPlugin {
private static Gem plugin;
private GemExecutor gemExecutor;
diff --git a/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java b/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java
index 0fe8194..aba655c 100644
--- a/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java
+++ b/modules/Gem/src/main/java/com/mcatk/gem/GemExecutor.java
@@ -43,16 +43,7 @@ public Integer getTotalGems(String name) {
}
public void addGems(String name, int addGems) {
- Integer gems = MySQLManager.getInstance().getGems(name);
- if (MySQLManager.getInstance().getGems(name) == null) {
- MySQLManager.getInstance().insertData(name);
- gems = 0;
- }
- Integer total = MySQLManager.getInstance().getTotal(name);
- gems += addGems;
- total += addGems;
- MySQLManager.getInstance().setGems(name, gems);
- MySQLManager.getInstance().setTotal(name, total);
+ MySQLManager.getInstance().addGems(name, addGems);
Gem.getPlugin().log(name + "获得宝石" + addGems);
}
}
diff --git a/modules/Gem/src/main/java/com/mcatk/gem/sql/MySQLManager.java b/modules/Gem/src/main/java/com/mcatk/gem/sql/MySQLManager.java
index f10ab60..ce26b1d 100644
--- a/modules/Gem/src/main/java/com/mcatk/gem/sql/MySQLManager.java
+++ b/modules/Gem/src/main/java/com/mcatk/gem/sql/MySQLManager.java
@@ -93,6 +93,22 @@ public Integer getTotal(String name) {
return null;
}
+ public void addGems(String name, int amount) {
+ try (PreparedStatement ps = connection.prepareStatement(
+ "INSERT INTO `gem` (`username`, `gems`, `total`) VALUES (?, ?, ?) " +
+ "ON DUPLICATE KEY UPDATE `gems` = `gems` + ?, `total` = `total` + ?"
+ )) {
+ ps.setString(1, name);
+ ps.setInt(2, amount);
+ ps.setInt(3, amount);
+ ps.setInt(4, amount);
+ ps.setInt(5, amount);
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
public void setGems(String name, int num) {
try (PreparedStatement ps = connection.prepareStatement(
"UPDATE `gem` SET `gems` = ? WHERE `username` = ?"
diff --git a/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java b/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java
new file mode 100644
index 0000000..0db43da
--- /dev/null
+++ b/modules/Gem/src/test/java/com/mcatk/gem/GemExecutorTest.java
@@ -0,0 +1,73 @@
+package com.mcatk.gem;
+
+import com.mcatk.gem.sql.MySQLManager;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.lang.reflect.Field;
+import java.util.logging.Logger;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GemExecutorTest {
+
+ @Mock
+ private MySQLManager mySQLManager;
+
+ @Mock
+ private Gem gemPlugin;
+
+ @Mock
+ private Logger logger;
+
+ private GemExecutor gemExecutor;
+
+ @Before
+ public void setUp() throws Exception {
+ // Mock Gem.plugin
+ setStaticField(Gem.class, "plugin", gemPlugin);
+ // when(gemPlugin.getLogger()).thenReturn(logger);
+
+ // Mock MySQLManager.instance
+ setStaticField(MySQLManager.class, "instance", mySQLManager);
+
+ gemExecutor = new GemExecutor();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ setStaticField(Gem.class, "plugin", null);
+ setStaticField(MySQLManager.class, "instance", null);
+ }
+
+ private void setStaticField(Class> clazz, String fieldName, Object value) throws Exception {
+ Field field = clazz.getDeclaredField(fieldName);
+ field.setAccessible(true);
+ field.set(null, value);
+ }
+
+ @Test
+ public void testAddGems_Optimized() {
+ String playerName = "TestPlayer";
+ int gemsToAdd = 100;
+
+ gemExecutor.addGems(playerName, gemsToAdd);
+
+ // Verify that addGems is called exactly once
+ verify(mySQLManager).addGems(playerName, gemsToAdd);
+
+ // Verify that redundant calls are NOT made
+ verify(mySQLManager, never()).getGems(anyString());
+ verify(mySQLManager, never()).getTotal(anyString());
+ verify(mySQLManager, never()).setGems(anyString(), anyInt());
+ verify(mySQLManager, never()).setTotal(anyString(), anyInt());
+ verify(mySQLManager, never()).insertData(anyString());
+ }
+}