【问题标题】:PowerMockito: can not mock Calendar.getInstancePowerMockito:无法模拟 Calendar.getInstance
【发布时间】:2021-06-16 14:09:29
【问题描述】:

我的代码看起来如何

@RunWith(PowerMockRunner.class)
@PrepareForTest({Calendar.class})
public class TestSomething {

  @Test
  public void mockCalendar() {
     Calendar calendar = Calendar.getInstance();
     PowerMockito.mockStatic(Calendar.class);
     //a few attempts here
     PowerMockito.when(Calendar.getInstance()).thenReturn(calendar);
     // or
     BDDMockito.when(Calendar.getInstance()).thenReturn(calendar);
     //or 
     Mockito.when(Calendar.getInstance()).thenReturn(calendar);
     //or
     BDDMockito.given(Calendar.getInstance()).willReturn(calendar);
}
}

但在任何情况下,Calendar 都会调用真正的方法 .getInstance()。 在以前的情况下,BDDMockito 一切正常,但现在我遇到了问题

【问题讨论】:

  • 尝试使用PowerMockito#when
  • @akortex91 我试过PowerMockito.when(Calendar.getInstance()) .thenThrow(RuntimeException.class); 但它不起作用
  • 你想达到什么目的?你能分享你的完整代码吗?
  • 我正在尝试实现模拟 Calendar.getInstance();因为我想使用相同的日历 - 在测试和运行测试的代码中
  • 当我尝试它时似乎工作正常(假设在 @PrepareForTest 您使用使用 Calendar 类的类)。正如我之前所说,共享您的测试代码可能有助于您解决此问题。

标签: java testing junit mockito powermockito


【解决方案1】:

假设您的实际情况是原始问题中发布的,我认为您使用 PowerMock 错误。

假设我有以下类,它有一个类似的方法,硬耦合到Calendar,我需要模拟它的创建(通过Calendar#getInstance 方法)。

public class SomeClass {

    public Calendar createInstance() {
        return Calendar.getInstance();
    }

}

为了使其正常工作并能够通过静态实例创建器模拟实例创建,您的测试应如下所示:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { SomeClass.class } )
public class SomeClassTest {

    private static final int YEAR  = 2020;
    private static final int MONTH = Calendar.JANUARY;
    private static final int DAY   = 1;

    private SomeClass someClass;

    @Before
    public void setUp() throws Exception {
        Calendar instance = Calendar.getInstance();
        instance.set(YEAR, MONTH, DAY);
        PowerMockito.mockStatic(Calendar.class);
        PowerMockito.when(Calendar.getInstance()).thenReturn(instance);
        someClass = new SomeClass();
    }

    @Test
    public void testDoSomething() {
        Calendar mocked = someClass.createInstance();
        assertNotNull(mocked);
        assertEquals(YEAR, mocked.get(Calendar.YEAR));
        assertEquals(MONTH, mocked.get(Calendar.MONTH));
        assertEquals(1, mocked.get(Calendar.DAY_OF_WEEK_IN_MONTH));
    }

}

这里的要点如下:

  1. @PrepareForTest( { SomeClass.class } ) 包含正在测试的类(在我们的例子中为 SomeClass)。
  2. 使用PowerMock 静态模拟Calendar,并返回一个新的真实实例(在setUp 方法中创建的实例)。

您可以继续使用这个可以正常工作的示例作为模板来调整您的测试。

【讨论】:

  • 嗯,问题出在@Prepare 测试上。我应该在那里指出调用日历的类,而不是日历。
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多