测试 FXGL 游戏
Testing a FXGL game
我正在 Java FXGL 中编写一个简单的游戏。我是 Java FX 和 FXGL 的新手。
我想用 JUnit5 测试我的游戏,但我无法让它运行...
问题:当我启动测试时,FXGL 属性尚未初始化。
如果有人能给我一个想法,我会很高兴,如何使用 FXGL.getWorldProperties()
为 class 启动测试
我的class:
public class Player {
private int playerColumn = 2; // The actual column from the player
private int nColumns; // Numbers of Columns in the game // Will be set on the init of the game
public int getPlayerColumn() {
return playerColumn;
}
// Some more code ...
/**
* The Input Handler for moving the Player to the right
*/
public void moveRight() {
if (playerColumn < nColumns - 1) {
playerColumn++;
}
updatePlayerPosition();
}
/**
* Calculates the x Offset for the Player from the column
*/
private void updatePlayerPosition() {
getWorldProperties().setValue("playerX", calcXOffset(playerColumn, playerFactory.getWidth()));
}
// Some more code ...
}
我的测试Class:我不知道我该怎么做...
@ExtendWith(RunWithFX.class)
public class PlayerTest{
private final GameArea gameArea = new GameArea(800, 900, 560, 90);
private final int nColumns = 4; // Numbers of Columns in the game
@BeforeAll
public static void init(){
Main.main(null);
}
@Test
public void playerColumn_init(){
Player player = new Player();
assertEquals(2, player.getPlayerColumn());
}
@Test
public void moveLeft_2to1(){
Player player = new Player();
player.moveLeft();
assertEquals(1, player.getPlayerColumn());
}
}
在这种情况下,测试根本不会启动,因为程序陷入了游戏循环...
但是如果我让 Main.main(null);
- 调用,proberties 不会初始化
通常,您有两种选择:
- 这是推荐的方法,因为我假设您要对自己的代码进行单元测试。
FXGL.getWorldProperties()
returns一个PropertyMap
。您可以让 Player
class 依赖于 PropertyMap
,而不是内部依赖于 FXGL.getWorldProperties()
。例如:
class Player {
private PropertyMap map;
public Player(PropertyMap map) {
this.map = map;
}
}
// production code
var player = new Player(FXGL.getWorldProperties());
// test code
var player = new Player(new PropertyMap());
- 不推荐这样做,尽管它可以用作集成测试。在另一个线程中使用
GameApplication.launch(YourApp.class)
启动整个游戏(它将阻塞直到游戏结束)。然后用 @Test
. 正常测试你的游戏
我正在 Java FXGL 中编写一个简单的游戏。我是 Java FX 和 FXGL 的新手。
我想用 JUnit5 测试我的游戏,但我无法让它运行... 问题:当我启动测试时,FXGL 属性尚未初始化。
如果有人能给我一个想法,我会很高兴,如何使用 FXGL.getWorldProperties()
我的class:
public class Player {
private int playerColumn = 2; // The actual column from the player
private int nColumns; // Numbers of Columns in the game // Will be set on the init of the game
public int getPlayerColumn() {
return playerColumn;
}
// Some more code ...
/**
* The Input Handler for moving the Player to the right
*/
public void moveRight() {
if (playerColumn < nColumns - 1) {
playerColumn++;
}
updatePlayerPosition();
}
/**
* Calculates the x Offset for the Player from the column
*/
private void updatePlayerPosition() {
getWorldProperties().setValue("playerX", calcXOffset(playerColumn, playerFactory.getWidth()));
}
// Some more code ...
}
我的测试Class:我不知道我该怎么做...
@ExtendWith(RunWithFX.class)
public class PlayerTest{
private final GameArea gameArea = new GameArea(800, 900, 560, 90);
private final int nColumns = 4; // Numbers of Columns in the game
@BeforeAll
public static void init(){
Main.main(null);
}
@Test
public void playerColumn_init(){
Player player = new Player();
assertEquals(2, player.getPlayerColumn());
}
@Test
public void moveLeft_2to1(){
Player player = new Player();
player.moveLeft();
assertEquals(1, player.getPlayerColumn());
}
}
在这种情况下,测试根本不会启动,因为程序陷入了游戏循环...
但是如果我让 Main.main(null);
- 调用,proberties 不会初始化
通常,您有两种选择:
- 这是推荐的方法,因为我假设您要对自己的代码进行单元测试。
FXGL.getWorldProperties()
returns一个PropertyMap
。您可以让Player
class 依赖于PropertyMap
,而不是内部依赖于FXGL.getWorldProperties()
。例如:
class Player {
private PropertyMap map;
public Player(PropertyMap map) {
this.map = map;
}
}
// production code
var player = new Player(FXGL.getWorldProperties());
// test code
var player = new Player(new PropertyMap());
- 不推荐这样做,尽管它可以用作集成测试。在另一个线程中使用
GameApplication.launch(YourApp.class)
启动整个游戏(它将阻塞直到游戏结束)。然后用@Test
. 正常测试你的游戏