每当使用 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:没有最后一次调用可用的模拟,我以前肯定见过这种错误,但不确定如何在这种情况下修复。我也愿意接受任何其他更优雅的方式来实现这一目标。总结:
- 如果
Timezone.getDefaultRef()
被调用,测试应该会失败
- 测试不应该因为从未调用该方法而失败(EasyMock 期待该方法但它永远不会出现)
- 一个测试失败不应影响其他测试
- 关于 TimeZone class 的其他一切都应该正常运行
我正在尝试寻找解决方法,但快速的答案是该方法未被模拟。在期望期间调用真正的方法。
PowerMock 无法模拟由 bootstrap class 加载程序加载的 classes。 TimeZone
就是其中之一。
解决方案是模拟调用它。已解释 here。它说你需要准备 class 调用系统 class 而不是系统 class.
但是对于你的情况,我不确定你能做到。因为您想知道某处是否有东西在呼叫您的 class。所以你不能准备任何正在使用 TimeZone
的东西,如果那是你正在寻找的。除非您的可能来电者范围有限。
我试图在调用 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:没有最后一次调用可用的模拟,我以前肯定见过这种错误,但不确定如何在这种情况下修复。我也愿意接受任何其他更优雅的方式来实现这一目标。总结:
- 如果
Timezone.getDefaultRef()
被调用,测试应该会失败 - 测试不应该因为从未调用该方法而失败(EasyMock 期待该方法但它永远不会出现)
- 一个测试失败不应影响其他测试
- 关于 TimeZone class 的其他一切都应该正常运行
我正在尝试寻找解决方法,但快速的答案是该方法未被模拟。在期望期间调用真正的方法。
PowerMock 无法模拟由 bootstrap class 加载程序加载的 classes。 TimeZone
就是其中之一。
解决方案是模拟调用它。已解释 here。它说你需要准备 class 调用系统 class 而不是系统 class.
但是对于你的情况,我不确定你能做到。因为您想知道某处是否有东西在呼叫您的 class。所以你不能准备任何正在使用 TimeZone
的东西,如果那是你正在寻找的。除非您的可能来电者范围有限。