【发布时间】:2020-08-07 15:29:10
【问题描述】:
每当调用 TimeZone.getDefaultRef() 方法时,我都会尝试抛出一个断言异常,以基本上表明在测试期间永远不会调用此方法。问题是它是包保护和静态的,所以我想我不得不使用 PowerMock。这是我的尝试:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TimeZone.class)
public class RandomTestingClass {
@Before
public void setup() {
PowerMock.mockStaticPartialNice(TimeZone.class, "getDefaultRef")
PowerMock.expectPrivate(TimeZone.class,
TimeZone.class.getDeclaredMethod("getDefaultRef")).andStubThrow(new AssertionError());
PowerMock.replay(TimeZone.class)
}
@Test
public void randomTestThatShouldFailBecauseMethodCallsGetDefaultRefMethod() {
Calendar.getInstance();
}
@Test
public void randomTestThatShouldPassBecauseMethodDoesNotCallGetDefaultRefMethod() {
Calendar.getInstance(TimeZone.getTimeZone("GMT"));
}
@After
public void after() {
PowerMock.verify(TimeZone.class);
{
我收到错误 java.lang.IllegalStateException: no last call on a mock available,我之前肯定见过,但不确定如何在这种情况下修复。我也愿意接受任何其他更优雅的方式来实现这一点。总结一下:
- 如果曾经调用过
Timezone.getDefaultRef(),测试应该会失败 - 测试不应仅仅因为从未调用过该方法而失败(EasyMock 期待该方法,但它永远不会出现)
- 一个测试失败不应影响其他测试
- TimeZone 类的其他所有内容都应该正常运行
【问题讨论】: