Restored BaseGameSimulationTest with proper Mocks set up

This commit is contained in:
leriomaggio
2021-07-15 08:22:27 +01:00
parent f1fbb0ff80
commit 712f907b59

View File

@@ -1,49 +1,46 @@
package forge.gamesimulationtests; package forge.gamesimulationtests;
import forge.ImageCache; import forge.ImageCache;
import forge.ImageKeys;
import forge.Singletons; import forge.Singletons;
import forge.gamesimulationtests.util.CardDatabaseHelper; import forge.card.ForgeCardMockTestCase;
import forge.gamesimulationtests.util.GameWrapper; import forge.gamesimulationtests.util.GameWrapper;
import forge.gamesimulationtests.util.player.PlayerSpecification; import forge.gamesimulationtests.util.player.PlayerSpecification;
import forge.gamesimulationtests.util.player.PlayerSpecificationHandler; import forge.gamesimulationtests.util.player.PlayerSpecificationHandler;
import forge.gamesimulationtests.util.playeractions.testactions.AssertAction; import forge.gamesimulationtests.util.playeractions.testactions.AssertAction;
import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgeConstants;
import forge.model.FModel; import forge.model.FModel;
import forge.util.Lang;
import forge.util.Localizer;
import io.sentry.Sentry;
import io.sentry.context.Context;
import org.powermock.api.mockito.PowerMockito; import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.testng.Assert; import org.testng.Assert;
import org.testng.IObjectFactory; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.ObjectFactory;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.util.ResourceBundle;
@PrepareForTest(value = { FModel.class, Singletons.class, ImageCache.class, ImageIO.class }) @PrepareForTest(value = {FModel.class, Singletons.class, ResourceBundle.class,
public class BaseGameSimulationTest extends PowerMockTestCase { ImageCache.class, ImageIO.class, ImageKeys.class,
//Can't run this with @BeforeTest or something like that, because of static voodoo ForgeConstants.class, Localizer.class, Sentry.class})
protected void initializeMocks() throws Exception { @SuppressStaticInitializationFor({"forge.ImageCache", "forge.localinstance.properties.ForgeConstants"})
//Loading a card also automatically loads the image, which we do not want (even if it wouldn't cause exceptions). public class BaseGameSimulationTest extends ForgeCardMockTestCase {
//The static initializer block in ImageCache can't fully be mocked (https://code.google.com/p/powermock/issues/detail?id=256), so we also need to mess with ImageIO...
//TODO: make sure that loading images only happens in a GUI environment, so we no longer need to mock this
PowerMockito.mockStatic(ImageIO.class);
PowerMockito.mockStatic(ImageCache.class);
//Mocking some more static stuff @BeforeMethod
ForgePreferences forgePreferences = new ForgePreferences(); @Override
PowerMockito.when(FModel.getPreferences()).thenReturn(forgePreferences); protected void initMocks() throws Exception {
PowerMockito.mockStatic(Singletons.class); super.initMocks();
PowerMockito.mockStatic(FModel.class); PowerMockito.mockStatic(Sentry.class);
PowerMockito.when(FModel.getMagicDb()).thenReturn(CardDatabaseHelper.getStaticDataToPopulateOtherMocks()); PowerMockito.when(Sentry.getContext()).thenReturn(new Context());
} Lang.createInstance("en-US");
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
} }
protected void runGame(GameWrapper game, PlayerSpecification expectedWinner, int finalTurn, AssertAction... postGameAssertActions) { protected void runGame(GameWrapper game, PlayerSpecification expectedWinner, int finalTurn, AssertAction... postGameAssertActions) {
try { try {
initializeMocks(); initMocks();
game.runGame(); game.runGame();
verifyThatTheGameHasFinishedAndThatPlayerHasWonOnTurn(game, expectedWinner, finalTurn); verifyThatTheGameHasFinishedAndThatPlayerHasWonOnTurn(game, expectedWinner, finalTurn);
if(postGameAssertActions != null && postGameAssertActions.length > 0) { if(postGameAssertActions != null && postGameAssertActions.length > 0) {
@@ -60,7 +57,8 @@ public class BaseGameSimulationTest extends PowerMockTestCase {
protected void verifyThatTheGameHasFinishedAndThatPlayerHasWonOnTurn(GameWrapper game, PlayerSpecification expectedWinner, int finalTurn) { protected void verifyThatTheGameHasFinishedAndThatPlayerHasWonOnTurn(GameWrapper game, PlayerSpecification expectedWinner, int finalTurn) {
Assert.assertTrue(game.getGame().isGameOver()); Assert.assertTrue(game.getGame().isGameOver());
Assert.assertEquals(game.getGame().getOutcome().getLastTurnNumber(), finalTurn); Assert.assertEquals(game.getGame().getOutcome().getLastTurnNumber(), finalTurn);
Assert.assertEquals(game.getGame().getOutcome().getWinningPlayer(), PlayerSpecificationHandler.INSTANCE.find(game.getGame(), expectedWinner)); Assert.assertEquals(game.getGame().getOutcome().getWinningPlayer().getPlayer().getName(),
PlayerSpecificationHandler.INSTANCE.find(game.getGame(), expectedWinner).getName());
Assert.assertTrue(game.getPlayerActions() == null || game.getPlayerActions().isEmpty()); Assert.assertTrue(game.getPlayerActions() == null || game.getPlayerActions().isEmpty());
} }
} }