Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mockito 1.10.17中的java.lang.VerifyError_Java_Testng_Mockito_Jmock - Fatal编程技术网

Mockito 1.10.17中的java.lang.VerifyError

Mockito 1.10.17中的java.lang.VerifyError,java,testng,mockito,jmock,Java,Testng,Mockito,Jmock,我试图用Mockito(1.10.17)替换JMock。我已经成功地完成了一些单元测试,但是现在我想使用超时特性 verify(publisher, timeout(5000)).notifySubscribers(any(BecameMasterMessage.class)); 我得到一个例外: java.lang.VerifyError: (class: org/mockito/internal/verification/VerificationOverTimeImpl, method:

我试图用Mockito(1.10.17)替换JMock。我已经成功地完成了一些单元测试,但是现在我想使用超时特性

verify(publisher, timeout(5000)).notifySubscribers(any(BecameMasterMessage.class));
我得到一个例外:

java.lang.VerifyError: (class: org/mockito/internal/verification/VerificationOverTimeImpl, method: verify signature: (Lorg/mockito/internal/verification/api/VerificationData;)V) Incompatible argument to function
    at org.mockito.verification.Timeout.<init>(Timeout.java:32)
    at org.mockito.verification.Timeout.<init>(Timeout.java:25)
    at org.mockito.Mockito.timeout(Mockito.java:2164)
这并不是:

verify(publisher, timeout(5000)).notifySubscribers(any(BecameMasterMessage.class));
更新3:
我做了一个小测试项目,它有着完全相同的问题:从IntelliJ或Maven查看并运行它。

这里的问题是TestNG、JUnit和Mockto之间的不幸组合。要解决此问题,只需向JUnit 4.0或更高版本(最新版本目前为4.12)添加依赖项:


朱尼特
朱尼特
4.12
详情如下:

TestNG显然是您的测试框架,它声明了对非常旧的JUnit版本3.8.1的依赖关系。Mockito根本没有声明对JUnit的依赖关系,但它使用了JUnit4.0(!)中引入的一些JUnit类

编辑:

示例中的方法
Mockito#timeout()
创建了一个
timeout
实例,该实例又创建了
VerificationOverTimeImpl
的实例。方法
VerificationOverTimeImpl#verify()
处理类型为
ArgumentsAdifferent
的错误,该错误是
org.junit.ComparisonFailure
的子类


从JUnit版本3.8.1到4.x,
ComparisonFailure
的类层次结构更改为使用
AssertionError
而不是
Error
作为基类。
VerificationError
是因为
VerificationOnVertimeImpl#handleVerifyException()
需要一个
AssertionError
,但在使用JUnit 3.8.1时会被调用,并出现
错误。

编辑:stefan似乎首先得到了回答。然而,他的诊断几乎是正确的,
org.mockito.exceptions.verification.junit.argumentsarediffer
do扩展了junit.framework.ComparisonFailure
,它出现在junit 3.x中,是TestNG 5.x的一个依赖项。 当JVM执行链接时,
VerifyError
本身可能有一些作用,因为JUnit3.x和JUnit4.x之间的
ComparisonFailure
类型本身发生了变化

无论如何,Mockito中的问题是它使用了一个JUnit类,而它不应该使用。Mockito不再支持JUnit3.x了

tl;tr

我们在代码内部遇到了一个问题,您使用的验证模式使用的是JUnit类,它不在类路径上。在POM的依赖项中添加JUnit将解决问题

谢谢你的报道。我在上创建了一个问题

说来话长

出于某种原因,TestNG 5.xxx使JVM在一个甚至没有在该点调用的方法上失败,并出现
VerifyError

java.lang.VerifyError: (class: org/mockito/internal/verification/VerificationOverTimeImpl, method: verify signature: 
   (Lorg/mockito/internal/verification/api/VerificationData;)V) Incompatible argument to function
但是切换到最新版本的TestNG,6.8。一些东西使JVM失败,原因是可以理解的:
NoClassDefFoundError

java.lang.NoClassDefFoundError: junit/framework/ComparisonFailure
这就指向了真正的问题,现在只需要找到哪个类依赖于JUnit。此类是扩展了junit.framework的
ArgumentsAdifferent
。ComparisonFailure,此异常出现在超时验证所需的
验证VertimeImpl
中的try/catch块中

这个问题可能是在1.10.x修复一些超时问题时出现的


注意,我也在上复制了这个答案。

这是一个愚蠢的“关闭并再次打开”问题,但值得一问:您是否清理了编译工件?即使类路径上只有一个版本的Mockito,VerificationOnVertimeImpl也会从1.9.5的VerificationWithTimeoutImpl重新命名,如果您曾经使用过1.9.5或更早版本,一些遗留的类文件可能会把所有东西都扔掉。@JeffBowman我做了
mvn clean install
,以确保这不是问题所在。我现在编辑了这个问题,并链接到一个显示该问题的示例项目。谢谢,我们现在就这样解决它。mockito声明对JUnit的依赖不是更好吗?然后Maven会选择好的JUnit版本问题。
org.mockito.exceptions.verification.JUnit.argumentsarediffer
extends
JUnit.framework.ComparisonFailure
VerifyError
是一个链接问题。JVM认为junit 3.x和junit 4.x中的
junit.framework.ComparisonFailure
在链接
org.mockito.exceptions.verification.junit.Arguments差异时会失败。无论如何,在mockito方面,问题是API的这一部分不应该依赖JUnit。这也表明mockito不再与JUnit3兼容。x@Brice谢谢你指出这一点。问题在于
ComparisonFailure
的类层次结构。我相应地修改了我的答案。你是对的,
argumentsaredifference
扩展自
junit.framework.ComparisonFailure
。所以我的答案在这一点上是非常错误的。在进一步研究这个问题之后,我认为问题在于
ComparisonFailure
的类层次结构。它是JUnit 3.8.1中的
AssertionFailedError
的子类,它是JUnit 4.x中的
AssertionError
的子类。将3.8.1版的
AssertionFailedError
修改为
AssertionError
的子类时,一切都很好。@StefanFerstl很好!JVM在执行链接时最有可能将此层次结构更改视为错误。
java.lang.VerifyError: (class: org/mockito/internal/verification/VerificationOverTimeImpl, method: verify signature: 
   (Lorg/mockito/internal/verification/api/VerificationData;)V) Incompatible argument to function
java.lang.NoClassDefFoundError: junit/framework/ComparisonFailure