每当使用 PowerMock (EasyMock) 调用包保护的静态方法时抛出异常

Throw Exception Whenever Package Protected Static Method Is Called Using PowerMock (EasyMock)

我试图在调用 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:没有最后一次调用可用的模拟,我以前肯定见过这种错误,但不确定如何在这种情况下修复。我也愿意接受任何其他更优雅的方式来实现这一目标。总结:

  1. 如果 Timezone.getDefaultRef() 被调用,测试应该会失败
  2. 测试不应该因为从未调用该方法而失败(EasyMock 期待该方法但它永远不会出现)
  3. 一个测试失败不应影响其他测试
  4. 关于 TimeZone class 的其他一切都应该正常运行

我正在尝试寻找解决方法,但快速的答案是该方法未被模拟。在期望期间调用真正的方法。

PowerMock 无法模拟由 bootstrap class 加载程序加载的 classes。 TimeZone 就是其中之一。

解决方案是模拟调用它。已解释 here。它说你需要准备 class 调用系统 class 而不是系统 class.

但是对于你的情况,我不确定你能做到。因为您想知道某处是否有东西在呼叫您的 class。所以你不能准备任何正在使用 TimeZone 的东西,如果那是你正在寻找的。除非您的可能来电者范围有限。