当前位置: 首页 > 知识库问答 >
问题:

PowerMock,模拟一个静态方法,然后对所有其他静态调用实方法

万修为
2023-03-14

我正在设置模拟类的静态方法。我必须在一个带有注释的JUnit安装方法之前的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?
}

我遇到的问题是,如果提供了null值,则在StaticUtilClass中,方法公共静态int staticMethod(String s)不幸地抛出RuntimeException

因此,我不能简单地将调用real方法作为默认答案,如下所示:

@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); 
}

在模拟了我感兴趣的方法的结果之后,我需要将默认答案设置为在所有其他静态方法上调用real方法。

这可能吗?

共有2个答案

苏华荣
2023-03-14

虽然我来晚了,但我们可以实现部分模拟,并通过显式指定来覆盖模拟对象的默认行为。

下面的示例显示了如果行为没有明确定义,我们如何使PowerMockito调用实方法:

e、 g.<代码>PowerMockito。mockStatic(MyClass.class,new CallsRealMethods())

晁璞
2023-03-14

你要找的是所谓的部分嘲弄。

在PowerMock中,您可以使用mockStaticParular方法。

在PowerMockito中,您可以使用存根,这将只存根定义的方法,而保持其他方法不变:

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

也不要忘记

@PrepareForTest(StaticUtilClass.class)
 类似资料:
  • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

  • 我想知道是否有一种方法来验证和调用一个模拟,该模拟是为一个私有静态方法创建的,该私有静态方法是从一个被测试的公共静态方法调用的。 下面是我正在测试的公共静态方法 我已经使用powermokito对私有静态方法进行了如下嘲弄:

  • Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或

  • 我试图用PowerMock在Mockito上模拟一个静态void方法,但它并不是那么好用。 我的示例代码: EvilBrother.java 我的问题是,嵌套类按照预期的方式使用@PrepareForTest和PowerMockito.MockStatic组合进行了模拟,但是如果类在自己的类文件中,这些语句就不起作用了。 如何修复这个测试? 与 尽管执行了assert.fail,但可以通过Powe

  • 我想编写一些使用JUnit4.12、Mockito1.9.5和PowerMock1.6.1的单元测试。这个类有一些用@mock注释的字段,还有一些用@injectmocks注释的字段。用@InjectMocks注释的属性在某个点到达一个父构造函数,该父构造函数包含一些静态方法调用,应该用PowerMock来模拟。问题是第一个测试是无缝工作的,而第二个测试似乎根本没有嘲弄静态方法。 如前所述,第一个