2009-12-27 73 views
2

我想我沒有正確使用verify。下面是測試:Java:模擬測試可能與Mockito

@Mock GameMaster mockGM;  
Player pWithMock; 

@Before 
public void setUpPlayer() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { 
    pWithMock = new Player(mockGM); 
} 

@Test 
    public void mockDump() { 
     pWithMock.testDump(); 
     verify(mockGM).emitRandom(); // fails 
    } 

下面是它調用的代碼:

public boolean testDump() { 
    Letter t = tiles.getRandomTile(); 
    return dump(t); 
} 

private boolean dump(Letter tile) { 
      if (! gm.canTakeDump() || tiles.count() == 0) { 
     return false; 
    } 

    tiles.remove(tile); 
    gm.takeTile(tile); 
    for (int i = 0; i < 3; i++) { 
     tiles.addTile(gm.emitRandom()); // this is the call I want to verify 
    } 
    return true; 
} 

故障跟蹤:

Wanted but not invoked: 
gameMaster.emitRandom(); 
-> at nth.bananas.test.PlayerTest.mockDump(PlayerTest.java:66) 

However, there were other interactions with this mock: 
-> at nth.bananas.Player.dump(Player.java:45) 

    at nth.bananas.test.PlayerTest.mockDump(PlayerTest.java:66) 

我想驗證的調用是幾層了。有沒有不同的方法來檢查這個?

+0

+1''gm.canTakeDump()' – grinch 2013-04-12 19:25:15

回答

0

有一個錯誤的測試方法:缺少對GameMaster#canTakeDump()的必要預期。從被測方法調用時(因爲它在第45行的if語句中的使用),此方法需要返回true

0

我不確定明白你在做什麼。鑑於以下Player類:

public class Player { 
    private final GameMaster gm; 

    public Player(GameMaster gameMaster) { 
     this.gm = gameMaster; 
    } 

    public void foo() { 
     gm.bar(); // this is the call we want to verify 
    } 
} 

而下面GameMaster類:

public class GameMaster { 
    public GameMaster() { 
    } 

    public void bar() { 
    } 
} 

我會寫的Player這樣的測試:

import static org.mockito.Mockito.verify; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

@RunWith(MockitoJUnitRunner.class) 
public class PlayerTest { 

    @Mock 
    private GameMaster gm; 

    @Test 
    public void testFoo() { 
     Player player = new Player(gm); 
     player.foo(); 
     verify(gm).bar(); // pass 
    } 
} 
+0

我絕對不知道自己在做什麼。這與我發佈的內容有什麼不同? – 2009-12-28 03:30:06

+0

另外,如果GameMaster類沒有沒有參數的構造函數呢? – 2009-12-28 03:33:51

+0

@Rosarch *這有什麼不同?*我不完全確定,因爲你沒有顯示所有的代碼,但是,這個工作:) *如果GameMaster沒有沒有參數的構造函數會怎樣?*好吧,這是一個示例,但如果您需要添加此構造函數以使代碼可測試,請執行此操作。 – 2009-12-28 04:29:06