java - InvalidUseOfMatchersException 在使用 mockito 强制在正在接受 junit 测试的 Copy() 方法中出现 CloneNotSupportedException 时

标签 java junit mockito

我正在尝试使用 mockito 访问受 try catch 保护的复制方法的一部分,同时尝试在我的 junit 测试中获得 100% 的覆盖率。包含我要访问的方法的类实现了可克隆,因此很难抛出 ClassNotFoundExceptions。

我尝试通过 mockito 在调用方法时抛出异常的能力以几种不同的方式强制执行此异常,但总是想出 InvalidUseOfMatchersException。

以下分别是我需要访问的代码和我为达到它所做的最佳尝试

catch(ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
}
MyClass dict = mock(MyClass.class);
Object obj1 = new Object();

when(MyClass.copy(anyObject())).thenThrow(ClassNotFoundException.class);
dict.copy(obj1);

我希望到达 cnfe.printStackTrace() 行但无法到达。

最佳答案

你似乎在 mock 一个静态方法,它实际上是 impossible .根据@Matthias 的说法,它需要在运行时修改类的字节码

您必须始终调用when使用实例方法调用,因为:

  1. 这保证了该方法将在 mock 上调用,不会在原始类(即 MyClass)上调用。
  2. 这可以防止编译时错误,因为无法从静态上下文中引用此类非静态方法。

这里是完整的 Java 代码:

try {
    MyClass dict = mock(MyClass.class);
    Object obj1 = new Object();

    when(dict.copy(anyObject())).thenThrow(ClassNotFoundException.class);
    dict.copy(obj1);
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
}

这应该输出:

Exception in thread "main" java.lang.ClassNotFoundException

关于java - InvalidUseOfMatchersException 在使用 mockito 强制在正在接受 junit 测试的 Copy() 方法中出现 CloneNotSupportedException 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650623/

相关文章:

java - 如何在java中使用mockito模拟调用类的方法

java - 从jsp中的内联java代码中提取字符串

scala - Scalacheck 中是否有与 delta 等效的 Junit assetEquals

android - Robolectric 4 测试在 Robolectric.buildActivity().setup() 处失败,并出现 java.lang.NullPointerException : Bitmap config was null

java - 检查方法是否返回相应类的实例

java - Junit - Spring 启动 : @Value is always null while testing

java - 字节数组消息在发送时被分割。我想一次性发送请求消息

java - StringBuffer 与 StringBuilder

java - 在 Java 中,如何在特定时间后(可靠地)从主线程中断线程?

java - 在java中模拟类变量值的问题