如何解决PowerMockito:无法模拟 Calendar.getInstance
我的代码看起来如何
@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 一切正常,但现在我遇到了问题
解决方法
假设您的实际是原始问题中发布的那个,我认为您使用 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));
}
}
这里的要点如下:
-
@PrepareForTest( { SomeClass.class } )
包含正在测试的类(在我们的例子中为SomeClass
)。 -
Calendar
使用PowerMock
静态模拟并返回一个新的真实实例(在setUp
方法中创建的实例)。
您可以继续使用此示例作为模板来调整您的测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。