【问题标题】:java.lang.NoSuchMethodError: org.mockito.internal.runners.RunnerFactory.createStrict(Ljava/lang/Class;)Lorg/mockito/internal/runners/InternalRunner;java.lang.NoSuchMethodError: org.mockito.internal.runners.RunnerFactory.createStrict(Ljava/lang/Class;)Lorg/mockito/internal/runners/InternalRunner;
【发布时间】:2017-12-05 11:18:15
【问题描述】:

我正在使用 Mockito jar 为 Groovy 编写 Junit 测试用例,但它给了我以下异常:

java.lang.NoSuchMethodError: org.mockito.internal.runners.RunnerFactory.createStrict(Ljava/lang/Class;)Lorg/mockito/internal/runners/InternalRunner;
at org.mockito.junit.MockitoJUnitRunner.<init>(MockitoJUnitRunner.java:152)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

以下是我拥有的 jar 列表:

cglib-nodep-2.2.2
javassist-3.19.0-GA
junit-4.12
mockito-all-1.10.19
objenesis-2.5
powermock-mockito-1.6.2-full

下面是我的代码。我添加了必要的导入:

package test.service
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
class SyncImplTest {

    @InjectMocks
    SyncThreatImpl  fixture;

    @Mock
    RpcConfigurationLoader rpcConfigurationLoader

    @Test
    public void testRpcConfig(){
        RpcApiInfo rpcApiInfo =  new RpcApiInfo();
        when(rpcConfigurationLoader.loadConfiguration()).thenReturn(rpcApiInfo)
    }


}

【问题讨论】:

    标签: java unit-testing groovy junit mockito


    【解决方案1】:

    出于某种原因,您的测试套件尝试从 Mockito 版本 >= 2.O 中包含的 org.mockito.junit 加载 MockitoJunitRunner。在该版本中,行:

    at org.mockito.junit.MockitoJUnitRunner.<init>(MockitoJUnitRunner.java:152)
    

    正在这样做:

    public MockitoJUnitRunner(Class<?> klass) throws InvocationTargetException {
            //by default, StrictRunner is used. We can change that potentially based on feedback from users
            this(new StrictRunner(new RunnerFactory().createStrict(klass), klass));
        }
    

    这里加载的 RunnerFactory 来自版本 1.x,因为 createStrict 已在 Mockito 2.x 中引入。

    因此,通过 pom 依赖树并找到将 Mockito 2.x 依赖项隐式添加到您的项目并将其排除的工件。

    或者.. 作为一种解决方法,您可以使用 @RunWith(MockitoJUnitRunner.class) 代替:

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }
    

    您还可以查看此Mockito cheat sheet 以掌握所有标准。

    【讨论】:

    • 您的回答解决了我正在从事的 bnd 项目中的类似问题。谢谢
    【解决方案2】:

    问题在于您的导入。 您的导入不包括导入运行器替换以下导入

    org.mockito.junit.MockitoJUnitRunner
    

     org.mockito.runners.MockitoJUnitRunner;
    

    【讨论】:

    • 您的解决方案解决了我们的问题,但引发了“org.mockito.runners.MockitoJUnitRunner”被弃用的警告。 Maciej Kowalski 的回答在没有任何警告的情况下解决了问题。
    【解决方案3】:

    在 Mockito 1.10.19(从 2014 年开始)中,没有类 org.mockito.junit.MockitoJUnitRunner。这是后来在 2.x 中引入的。如果您真的想使用 1.10.19,您可能应该使用正确的类 org.mockito.runners.MockitoJUnitRunner,然后它应该可以工作。

    但我强烈建议改用更新的 Mockito 版本。 mockito-all 根本不再是可以依赖的正确工件了。在 2.x 中,这个工件不再被维护了。

    【讨论】:

    • 我用 mockito-core 2.13.0 替换了 Mockito-all 并且工作起来就像一个魅力
    【解决方案4】:

    我在以下版本中遇到了同样的问题。 就我而言,通过org.apache.maven:maven:3.6.3 存在mockito-core 依赖项。所以我不得不重写依赖。

     <version.maven-surefire-plugin>3.0.0-M5</version.maven-surefire-plugin>
     <version.junit-jupiter-engine>5.8.2</version.junit-jupiter-engine>
     <version.mockito-junit-jupiter>4.3.1</version.mockito-junit-jupiter>
    

    要检查这一点,您可以使用:mvn help:effective-pom -Dverbose=true -Doutput=effective-pom.xml

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2018-11-26
      • 2012-08-24
      • 2016-05-07
      相关资源
      最近更新 更多