当junit3在类路径上时,mockito失败

时间:2018-11-02 13:23:48

标签: java junit mockito

我正在一个有很多遗留junit3测试的项目中。我们最近已切换到JUnit 5,并且正在通过junit-vintage运行旧的测试。由于多种原因,我们无法轻松摆脱junit3依赖关系,因此它仍位于类路径中(到目前为止,不会引起任何问题)。

在捕获参数差异的测试中使用mockito.verify()时会出现问题:

public class TestTestTest {
    interface Foo {
        void frobnicate(int a);
    }

    @Test
    void testMockito() {
        Foo foo = mock(Foo.class);
        foo.frobnicate(42);
        verify(foo).frobnicate(43);
    }
}

结果

java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    org/mockito/internal/junit/ExceptionFactory$JUnitArgsAreDifferent.create(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/AssertionError; @10: areturn
  Reason:
    Type 'org/mockito/exceptions/verification/junit/ArgumentsAreDifferent' (current frame, stack[0]) is not assignable to 'java/lang/AssertionError' (from method signature)
  Current Frame:
    bci: @10
    flags: { }
    locals: { 'java/lang/String', 'java/lang/String', 'java/lang/String' }
    stack: { 'org/mockito/exceptions/verification/junit/ArgumentsAreDifferent' }
  Bytecode:
    0x0000000: bb00 0259 2a2b 2cb7 0003 b0            


    at org.mockito.internal.junit.ExceptionFactory.canLoadJunitClass(ExceptionFactory.java:33)
    at org.mockito.internal.junit.ExceptionFactory.<clinit>(ExceptionFactory.java:12)
    at org.mockito.internal.exceptions.Reporter.argumentsAreDifferent(Reporter.java:313)
    at org.mockito.internal.verification.checkers.MissingInvocationChecker.checkMissingInvocation(MissingInvocationChecker.java:43)
    at org.mockito.internal.verification.Times.verify(Times.java:37)
    at org.mockito.internal.verification.MockAwareVerificationMode.verify(MockAwareVerificationMode.java:27)
    at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:72)
    at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
    at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:35)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:63)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:49)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptAbstract(MockMethodInterceptor.java:128)
    at test.TestTestTest$Foo$MockitoMock$448839763.setValue(Unknown Source)
    at test.TestTestTest.testMockito(TestTestTest.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:513)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
    at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:113)
    at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:121)

根本原因似乎是链接器错误(ArgumentsAreDifferent是junit4 AssertionError,而不是junit3 AssertionError

假设我无法摆脱junit3依赖性,是否有解决方法?

1 个答案:

答案 0 :(得分:0)

我在Mockito中遇到了同样的错误。但是,有com.google.android.tools:dx:1.7而不是JUnit3。但是看起来这种依赖关系至少包含一些JUnit3的程序包和类。 这里的问题是Mockito创建扩展ArgumentsAreDifferent的{​​{1}}类。在JUnit 4 junit.framework.ComparisonFailure中,通过中间类扩展了ComparisonFailure,这是Mockito期望的。但是在JUnit 3(和com.google.android.tools:dx)中,java.lang.AssertionError不会扩展ComparisonFailure

我已经通过排除此依赖关系对其进行了修复,因为实际上我不需要它。 由于需要JUnit3,因此不知道如何解决此问题。也许是类加载顺序。但是希望这些信息会有所帮助。