与Mockito 1.10.17的java.lang.VerifyError

Wim*_*uwe 5 java testng jmock mockito

我试图用Mockito取代JMock(1.10.17).我已经成功完成了一些单元测试,但现在我想使用超时功能

verify(publisher, timeout(5000)).notifySubscribers(any(BecameMasterMessage.class));
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

问题发生在IntelliJ和Maven中.类路径上只有一个版本的Mockito.在类路径上还有JMock 2.5.1,我无法删除,因为此时99%的单元测试仍然使用JMock.我不知道这与它有什么关系.

更新:我尝试使用JMock 2.6.0和Hamcrest 1.3,但结果是一样的.

更新2:

这有效:

Thread.sleep( 5000 );
verify( m_publisher ).notifySubscribers( any( BecameMasterMessage.class ) );
Run Code Online (Sandbox Code Playgroud)

而这不是:

verify(publisher, timeout(5000)).notifySubscribers(any(BecameMasterMessage.class));
Run Code Online (Sandbox Code Playgroud)

更新3:我做了一个小测试项目,它有完全相同的问题:请参阅https://github.com/wimdeblauwe/mockito-verify-problem并从IntelliJ或Maven运行它.

Ste*_*stl 5

这里的问题是TestNG,JUnit和Mockto之间的一个不幸的星座.要解决您的问题,您只需要向JUnit 4.0或更高版本添加依赖项(最新版本当前为4.12):

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

以下是详细信息:

TestNG,显然是你的测试框架,声明了对相当旧的JUnit版本3.8.1的依赖.Mockito根本没有声明对JUnit的依赖,但是它使用了JUnit 4.0(!)中引入的一些JUnit类.

编辑:

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

从JUnit版本3.8.1到4.x,类层次结构已ComparisonFailure更改为具有AssertionError而不是Error作为基类.这VerifiyError是因为VerificationOverTimeImpl#handleVerifyException()需要一个AssertionError但是Error在使用JUnit 3.8.1时会被调用.