【问题标题】:Mocking a Static Method without replayAll() in PowerMock在 PowerMock 中模拟没有 replayAll() 的静态方法
【发布时间】:2013-03-18 23:36:39
【问题描述】:

有谁知道不用调用 replayAll() 模拟静态类的方法吗?我见过很多人们嘲笑 Math.random() 并使用 replayAll() 的例子。对我来说,似乎 replayAll() 是处理事情的更懒惰的方式,但我还没有找到一种方法来使用 replay(Object mocks) 来模拟静态方法。

例如,考虑以下我发现的示例 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 版。

【问题讨论】:

  • 显然你可以做一个PowerMock.verify(Math.class); 应该可以工作。
  • PowerMock.replay(Math.class) 使用相同的代码为我工作,我只将这一行和版本更改为 1.4.10。编辑:PowerMock.verify(Math.class) 也在工作

标签: java unit-testing junit easymock powermock


【解决方案1】:

您可以通过使用 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);
   }
}

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多