当前位置: 首页 > 面试题库 >

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

农均
2023-03-14
问题内容

当我测试此静态方法时

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

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

我知道了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是否可以模拟这种方法。


问题答案:

尝试将isA()替换为另一个any()这样的调用

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), any(Log.class))).thenReturn(1L);

[编辑]

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

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

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

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



 类似资料:
  • 当所有参数都在使用匹配器时,为什么我会得到这个异常?如何解决?我调试了它,发现返回null。 当我将注释添加到测试类并运行测试时,junit不会做出响应。为什么? 编辑 我试着不使用论据匹配器,结果

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 在尝试模拟InetAddress中的静态方法时,我遇到了奇怪的问题。我成功地能够为许多其他类模拟静态方法,并且一切正常,但InetAddress显示不同的行为。我使用的是JUnit 4. x、Mockito 1.9.5 下面给出了使用Mockito和PowerMock以及InetAddress模拟的测试- 当我将下面给出的方法放入某个实用程序InetAddress中时。getLocalHost()

  • 编辑: 感谢所有的回复。我找到了解决办法。我试图模拟一个方法findById,它不是直接在User.class中,而是在用户扩展的genericModel.class中。现在一切都很完美。

  • 我有一个类需要测试: 和一个测试类: 我必须模拟静态调用,以便它按我的预期返回 我遵循以下步骤: @RunWith(PowerMockRunner.class) @PrepareForTest({ Collections.class, StreamSupport.class, CampaignHandlerFactory.class}) PowerMockito.mockStatic(clazz)