java - PowerMock,模拟一个静态方法,然后在所有其他静态上调用真实方法

标签 java junit mockito powermock

我正在设置模拟类的静态方法。我必须在 @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 方法 public static int someStaticMethod(String s) 不幸地抛出了一个 RuntimeException 如果提供 null 值。

所以我不能简单地将调用真实方法作为默认答案的明显路线如下:

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

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

这可能吗?

最佳答案

你在找什么叫做partial mocking

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

在 PowerMockito 中,您可以使用 stub ,它只会 stub 定义的方法,而其他保持不变:

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

也别忘了

@PrepareForTest(StaticUtilClass.class)

关于java - PowerMock,模拟一个静态方法,然后在所有其他静态上调用真实方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651138/

相关文章:

java - 如果找不到,在引用表中添加记录的最佳方法

java - Selenium:为什么 click() 的行为不像在 Firefox 中那样?

java - 在 Java 中使用 Mockito 模拟 JPA 存储库不会被调用

java - 在 doThrow JUNIT 之后捕获异常

Java 8表达式从列表中填充列表,其中包含另一个列表

java - 如何在没有Java中的java.net.BindException的情况下监听本地主机中的两个端口?

java - EasyMock JUnit 测试在 setter 方法上抛出错误

java - 简单的 Mockito 测试(Spring + Dao)

java - 如何在Junit中验证公共(public)方法中私有(private)方法的调用次数?

java - 如何使用Guice处理多层注入(inject)