PowerMockito:使用匹配器模拟静态方法时收到InvalidUseOfMatchersException

Kir*_*Yao 5 java mockito powermock

当我测试此静态方法时

public class SomeClass {
    public static long someMethod(Map map, String string, Long l, Log log) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

import org.apache.commons.logging.Log;

@RunWith(PowerMockRunner.class)
//@PrepareForTest(SomeClass.class)
public class Tests {
    @Test
    public void test() {
        ...
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道了InvalidUseOfMatchersException。我的问题是:

  1. 当所有参数都使用匹配器时,为什么会出现此异常?怎么解决呢?我已经调试了它,发现isA(Log.class)返回null。
  2. 当我将@PrepareForTest注释添加到测试类并运行测试时,junit不会响应。为什么?

编辑

我试图不使用参数匹配器,并得到

org.mockito.exceptions.misusing.MissingMethodInvocationException:when()需要一个参数,该参数必须是“模拟的方法调用”。例如:when(mock.getArticles())。thenReturn(articles);

同样,由于以下原因,可能会出现此错误:

  1. 您存根以下方法之一:final / private / equals()/ hashCode()方法。这些方法不能存根/验证。

  2. 在when()内部,您不会在模拟对象上调用方法,而是在其他对象上调用方法。

在 ...

因此,似乎是由于someMethod本身。该方法中有同步块。我想知道Powermockito是否可以模拟这种方法。

Bra*_*rad 2

尝试将 isA() 替换为另一个 any() 调用,如下所示

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), any(Log.class))).thenReturn(1L);
Run Code Online (Sandbox Code Playgroud)

[编辑]

收到异常时检查堆栈跟踪。你看到有NoClassDefFoundError报道吗?我注意到当我没有将 包含javassist.jar在我的项目中时,我遇到了与您类似的错误。

我使用 PowerMockito,这些是我添加到一个全新项目中的 jar,用于运行 @Tom 发布的代码

  • powermock-mockito-1.4.10-full.jar
  • 模拟-all-1.8.5.jar
  • javassist-3.15.0-GA.jar
  • junit-4.8.2.jar
  • common-logging-1.1.1.jar

检查您是否使用兼容的 JAR 版本,并检查项目类路径中是否存在任何其他冲突的 JAR 始终是一个好主意。