首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当junit3在类路径上时,Mockito会失败

当junit3在类路径上时,Mockito会失败
EN

Stack Overflow用户
提问于 2018-11-02 21:23:48
回答 1查看 371关注 0票数 0

我正在做一个有很多遗留junit3测试的项目。我们最近切换到了JUnit 5,并通过junit-vintage运行旧的测试。由于几个原因,我们不能很容易地摆脱junit3依赖,所以它仍然在类路径上(到目前为止还没有引起任何问题)。

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

代码语言:javascript
复制
public class TestTestTest {
    interface Foo {
        void frobnicate(int a);
    }

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

结果:

代码语言:javascript
复制
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依赖,有没有解决方法?

EN

回答 1

Stack Overflow用户

发布于 2019-09-18 20:42:51

我在Mockito上也遇到了同样的错误。然而,用com.google.android.tools:dx:1.7代替了JUnit3。但是看起来这个依赖至少包含一些JUnit3的包和类。这里的问题是,Mockito创建了扩展junit.framework.ComparisonFailureArgumentsAreDifferent类。在Mockito4中,ComparisonFailure通过中间类扩展了java.lang.AssertionError,这是JUnit所期望的。但是在JUnit 3(和com.google.android.tools:dx)中,ComparisonFailure并没有扩展AssertionError

我已经修复了它,只是排除了这个依赖,因为我实际上不需要它。不知道如何在您的情况下修复此问题,因为需要JUnit3。可能是类加载顺序之类的。但希望这些信息能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53119400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档