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()); + } +}