2013-03-18 99 views
1

有沒有人知道如何在不調用replayAll()的情況下對靜態類進行模擬?我看到很多例子,人們嘲笑Math.random()並使用replayAll()。對我來說,似乎replayAll()是關於事物的懶惰方式,但我一直無法找出使用重放(對象嘲諷)來嘲諷靜態方法的方法。在PowerMock中不使用replayAll()來模擬靜態方法

例如,考慮下面的例子中,我在 PowerMockTutorial發現:

public class Dice { 
    public int sumOfNumDieRolls (int num) { 
     int sum = 0; 
     for (int i=0; i<num; ++i) { 
     int roll = (int) (6. * Math.random()) + 1; 
     sum += roll; 
     } 
     return sum; 
    } 
} 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Dice.class}) 
public class DiceTest { 
    @Test 
    public void shouldAddUpDieRollsCorrectly() { 
     PowerMock.mockStaticPartial(Math.class, "random"); 
     EasyMock.expect (Math.random()).andReturn(0.3334).anyTimes(); 
     Dice die = new Dice(); 
     PowerMock.replayAll(); 
     assertEquals (12, die.sumOfNumDieRolls(4)); 
     assertEquals (30, die.sumOfNumDieRolls(10)); 
     PowerMock.verifyAll(); 
    } 
} 

我使用PowerMock版本1.4.10。

+0

顯然你可以做一個'PowerMock.verify(Math.class);'它應該工作。 – HardcoreBro 2013-04-16 16:18:51

+0

PowerMock.replay(Math.class)爲我工作的代碼非常相似,我只將這一行和版本更改爲1.4.10。 編輯:PowerMock.verify(Math.class)也在工作 – cahen 2013-04-20 09:47:17

回答

0

您可以通過使用PowerMock.replay([object_name])來做到這一點,以便您不必重播所有內容。對於這個例子,它看起來像下面這樣:

public class Dice { 
    public int sumOfNumDieRolls (int num) { 
     int sum = 0; 
     for (int i=0; i<num; ++i) { 
     int roll = (int) (6. * Math.random()) + 1; 
     sum += roll; 
     } 
     return sum; 
    } 
} 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Dice.class}) 
public class DiceTest { 
    @Test 
    public void shouldAddUpDieRollsCorrectly() { 
     PowerMock.mockStaticPartial(Math.class, "random"); 
     EasyMock.expect (Math.random()).andReturn(0.3334).anyTimes(); 
     Dice die = new Dice(); 
     PowerMock.replay(Math.class); 
     assertEquals (12, die.sumOfNumDieRolls(4)); 
     assertEquals (30, die.sumOfNumDieRolls(10)); 
     PowerMock.verify(Math.class); 
    } 
} 
相關問題