java 错误初始化模拟,每次和任何测试用例

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31685267/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 19:00:15  来源:igfitidea点击:

error initializing mockito, everytime and for any test cases

javaunit-testingmockingmockito

提问by apil.tamang

Pretty much spent the entire day fighting this. It doesn't matter what kind of tests/class/interface I use, I get pretty much the same exception. Here's the stackerror:

几乎花了一整天的时间来解决这个问题。我使用什么样的测试/类/接口并不重要,我得到几乎相同的异常。这是堆栈错误:

java.lang.AbstractMethodError: org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable(Ljava/lang/Class;)Lorg/mockito/plugins/MockMaker$TypeMockability;
    at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:26)
    at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:21)
    at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:167)
    at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:161)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:58)
    at org.mockito.Mockito.mock(Mockito.java:1410)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.java:66)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:108)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.withBefores(JUnit45AndHigherRunnerImpl.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:246)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access
public class ClassA {

    private String message;

    public String getMessage(){

        message="classA";
        return message;

    }
}

public class ClassB {

    private ClassA myClass;

    public ClassB(ClassA aClass){
        this.myClass=aClass;
    }

    public ClassA getClassA(){
        return myClass;
    }
}
0(ParentRunner.java:50) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355) at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl.run(DefaultExecutorFactory.java:64) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)

Infact, I don't even understand why the powermock library is involved. It does get compiled as I was trying to mock some final classes, but that was hours ago!

事实上,我什至不明白为什么会涉及到 powermock 库。当我试图模拟一些最终课程时,它确实被编译了,但那是几个小时前!

Here's an actual set of files I'm trying to utilize:

这是我尝试使用的一组实际文件:

package com.icidigital.services

import com.icidigital.users.ClassA
import com.icidigital.users.ClassB
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.runners.MockitoJUnitRunner
/**
 * Created by apil.tamang on 7/28/15.
 */
@RunWith(MockitoJUnitRunner.class)
class TestSimplestMock {

    ClassB classB;

    @Mock
    ClassA mockA;

    @Before
    public void setup(){


        classB=new ClassB(mockA);

        Mockito.when(classB.getClassA()).thenReturn(null);

    }

    @Test
    public void testA(){

        ClassA obj=classB.getClassA();

        assert(obj==null);

    }
}

and the testing class:

和测试类:

import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;

回答by Rafael Winterhalter

It is possible for third-party plugins to register custom MockMakerimplementations that create classes differently to the default behavior via Mockito's SPI. As a part of the specified behavior, since Mockito 2.0, a MockMakercan decide if a class is mockable, such as finalclasses in the case of PowerMock. In order to integrate such a custom behavior, PowerMock registers a custom MockMakerthat is then used by Mockito.

第三方插件可以注册自定义MockMaker实现,通过 Mockito 的 SPI 创建与默认行为不同的类。作为指定行为的一部分,从 Mockito 2.0 开始,aMockMaker可以决定一个类是否是可模拟的,例如finalPowerMock 中的类。为了集成这样的自定义行为,PowerMock 注册了一个自定义MockMaker,然后由 Mockito 使用。

In Mockito 2.0, the API for a custom MockMakerhad to be extended but PowerMockdoes not yet adapt the API extensions. Therefore, this new method is not yet implemented by the PowerMock MockMakerwhat results in an AbstractMethodError.

在 Mockito 2.0 中,MockMaker必须扩展自定义 API,但PowerMock尚未适配 API 扩展。因此,这个新方法还没有被 PowerMock 实现,MockMaker结果是AbstractMethodError.

回答by Dornathal

I ran into the same Error. For me it helped to include

我遇到了同样的错误。对我来说,它有助于包括

testCompile 'org.powermock:powermock-api-mockito2:1.7.0RC4'

instead of Mockitos mock()and spy()methods. @Mockremained the same.

而不是 Mockitosmock()spy()方法。@Mock保持不变。

回答by Roman Nazarevych

The correct answer was given by Raphael Winterhalter. But currently PowerMockitoteam is working on bringing support of Mockito2+ Latest stable version for now is RC4

Raphael Winterhalter给出了正确的答案。但目前PowerMockito团队正在努力支持 Mockito2+ 目前最新的稳定版本是 RC4

##代码##

It compiles but there are still a lot of issues

编译通过了,但还是有很多问题

Here is Wiki page about Mockito 2 support https://github.com/powermock/powermock/wiki/Mockito-2-(Maven)

这是关于 Mockito 2 支持的 Wiki 页面 https://github.com/powermock/powermock/wiki/Mockito-2-(Maven)

回答by armen

Not sure if that is what you are trying to do. But if you are trying to return null whenever getClassA is called, then you should mock object of type ClassB! (since getClassA is a method of that class).

不确定这是否是您想要做的。但是如果你试图在调用 getClassA 时返回 null,那么你应该模拟 ClassB 类型的对象!(因为 getClassA 是该类的方法)。

回答by Kaushik

I had the same issue when working with mockito-core:jar:2.18.3 and powermock-api-mockito:1.6.3. It worked for me when I downgraded to mockito-core:jar:2.0.5-beta.

我在使用 mockito-core:jar:2.18.3 和 powermock-api-mockito:1.6.3 时遇到了同样的问题。当我降级到 mockito-core:jar:2.0.5-beta 时,它对我有用。