我正在尝试使用 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
使用实例方法调用,因为:
- 这保证了该方法将在 mock 上调用,不会在原始类(即
MyClass
)上调用。 - 这可以防止编译时错误,因为无法从静态上下文中引用此类非静态方法。
这里是完整的 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/