PowerMock,模拟静态方法,然后调用所有其他静态方法的实际方法

46

我正在设置模拟一个类的静态方法。我必须在一个用@Before注释的JUnit设置方法中执行此操作。

我的目标是设置该类调用真实方法,除了那些我明确模拟的方法。

基本上:

@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class);

  // mock out certain methods...
  when(StaticUtilClass.someStaticMethod(anyString())).thenReturn(5); 

  // Now have all OTHER methods call the real implementation???  How do I do this?
}

我遇到的问题是在 StaticUtilClass 中,如果传入一个 null 值,public static int someStaticMethod(String s) 方法会不幸地抛出一个 RuntimeException。因此我不能简单地按以下方式调用真实方法作为默认答案:
@Before
public void setupStaticUtil() {
  PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods

  // The below call to someStaticMethod() will throw a RuntimeException, as the arg is null!
  // Even though I don't actually want to call the method, I just want to setup a mock result
  when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5); 
}

我需要将默认答案设置为在模拟我想要模拟的方法的结果之后对所有其他静态方法调用实际方法。

这个可能吗?


匹配器应该是 anyString() 而不是 antString()。 - Nathan Adams
@Nathan Adams - 是的。已更新。 - Tom Tresansky
2个回答

71

你要找的东西被称为部分模拟

在 PowerMock 中,你可以使用 mockStaticPartial 方法。

在 PowerMockito 中,你可以使用存根(stubbing),只对定义的方法进行存根,而保留其他内容不变:

PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);

还有别忘了

@PrepareForTest(StaticUtilClass.class)

我在我的PowerMockito类中没有看到stub()或mockStaticPartial()方法。版本1.5。在我的版本为1.9.5的Mockito类中,我在这里看到了一个stub()方法:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#stub(T),但是阅读文档后我发现这个链接:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#when(T)指出**when()是被弃用的stub(Object)的继承者**,所以我认为这个方法不再适用,并且无论如何都不能满足我的需求。 - Tom Tresansky
mockStaticPartial 是为 EasyMock 定义的 - 我没有注意到你明确要求 Mockito - http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/easymock/PowerMock.html - zibi
1
stub被定义在MemberModifier中,它是PowerMockito的一个超类 - 它就在那里!- http://powermock.googlecode.com/svn/docs/powermock-1.5/apidocs/org/powermock/api/support/membermodification/MemberModifier.html#stub%28java.lang.reflect.Method%29 - zibi
4
你好!需要帮忙吗?如何使用特定参数创建存根方法? - Arthur

4
尽管我来晚了,但我们可以通过明确指定来实现部分模拟和覆盖模拟对象的默认行为。 下面的示例展示了如何使PowerMockito在行为未明确定义时调用真实方法: 例如:PowerMockito.mockStatic(MyClass.class, new CallsRealMethods());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接