2009-12-27 81 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