【问题标题】:InvalidUseOfMatchersException when using mockito to force a CloneNotSupportedException in a Copy() method being junit testedInvalidUseOfMatchersException 使用 mockito 强制在被 junit 测试的 Copy() 方法中的 CloneNotSupportedException
【发布时间】:2019-11-01 04:29:45
【问题描述】:

我正在尝试使用 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() 行但不能。

【问题讨论】:

  • 同样的问题适用于我需要抛出一个 clonenotsupportedexception 的克隆方法 I
  • 您想抛出 ClassNotFoundException,但实际上您正在抛出 CloneNotSupportedException。
  • @MaximeLaunois 输入错误 - 谢谢,但错误仍然存​​在

标签: java junit mockito


【解决方案1】:

您似乎在嘲笑一个静态方法,实际上是impossible。根据@Matthias,需要在运行时修改类的字节码

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

  1. 这保证了该方法将在模拟上调用,而不会在原始类(即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();
}

这应该输出:

线程“主”java.lang.ClassNotFoundException 中的异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多