2017-04-07 17 views
2

所以我正在研究一個項目,我需要設計一個有玩家的遊戲。遊戲裏面的對象,我已經初始化的球員,並設置一個getter該球員:爲什麼我的一個類的自定義成員變量沒有在其他類中更新?

Player declaration getPlayer method

玩家只知道它自己的定居點。每當我找到一個新的解決方案時,解決方案應該被添加到該特定玩家的定居點數組列表中。所以,在玩家類中,我已經初始化了一個數組列表,並且給這個數組列表添加了一個解決方法。

Player's settlements array AddToSettlement

當我寫了多個測試發現沉降電話,我加不堅持的函數調用之外在我的遊戲對象的定居點:

found settlement

我知道這是一些範圍或靜態聲明的某種錯誤,但我不明白爲什麼我的實現不起作用。任何幫助是極大的讚賞!

編輯:這可能是一個更好的例子,沒有通過。

map.foundNewSettlement(new Coordinate(1,1)); 
map.foundNewSettlement(new Coordinate(-2,3)); 
System.out.print(map.getPlayer().getSettlements().size()); 

被打印的大小爲0時,它應該是2

+2

請不要張貼文本/代碼的圖像。 –

回答

2

實例字段在推出每個測試方法重新初始化。
所以game實例在測試方法之間不是持久的。

如果第二個測試是測試「添加第二個結算」,那麼在調用方法測試之前,您應該先添加結算(即創建測試的初始上下文):addSettlement()

此外,測試方法不應該依賴其他測試方法執行的以前的副作用。
保持您的測試方法獨立,以保持其獨立和可維護性。

因此,您應該爲每個測試方法創建初始化上下文。
開始時,您可以直接在測試方法中執行此任務。
稍後如果您開始重複初始化上下文,您可以引入私有方法來完成它。

這是一個非常簡單的例子來說明如何創建使用JUnit的背景:

private Game game; 

// executed before each test method 
@Before 
public void setup(){ 
    Game game = new Game(); 
    game.addPlayer(new Player(...)); 
} 

@Test 
public void addASecondSettlement(){ 
    // context 
    game.getPlayer().addSettlement(new Settlement(1)); 
    // action 
    game.getPlayer().addSettlement(new Settlement(2)); 
    //assertion 
    Assert.assertEquals(2, game.findLastSetllement().getId()); 
} 
+0

我已經添加了測試,作爲我的程序中稱爲「找到的解決方案」的不同代碼的一個示例,該程序在遊戲中作爲其自身的功能存在。在我的「找到的定居點」功能被調用後,玩家的定居點數組應該包含新的定居點,但不是持久的。我已將測試代碼更改爲已實現的結算。 – Nepoche

+1

因爲'遊戲'實例在第一次測試後沒有被保存,並且結算的ArrayList包含在'遊戲'中。兩次測試之間不會保留測試所做的更改。 – davidxxx

+0

你絕對是對的,我在編寫這些模擬測試時應該多加小心,但考慮一下:我有一個驗收測試,可以「找到」多個定居點。在這一項驗收測試中,定居點的成立並非一成不變。 – Nepoche

1

除了@davidxx答案:

您可以在您的測試使用靜態變量的遊戲:

private static Game game = new Game(); 

,或者如果你需要更多的行動,以提前做好使用static

private static Game game; 
    static 
    { 
     game = new Game(); 
     ... do more preparations ... 
    } 

或更正確的JUnit的辦法有一個@BeforeClass註解靜態方法

private static Game game; 

@BeforeClass 
public static void init() 
{ 
    game=new Game(); 
    ... do more preparations ... 
} 
相關問題