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
error initializing mockito, everytime and for any test cases
提问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.accesspublic 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 MockMaker
implementations that create classes differently to the default behavior via Mockito's SPI. As a part of the specified behavior, since Mockito 2.0, a MockMaker
can decide if a class is mockable, such as final
classes in the case of PowerMock. In order to integrate such a custom behavior, PowerMock registers a custom MockMaker
that is then used by Mockito.
第三方插件可以注册自定义MockMaker
实现,通过 Mockito 的 SPI 创建与默认行为不同的类。作为指定行为的一部分,从 Mockito 2.0 开始,aMockMaker
可以决定一个类是否是可模拟的,例如final
PowerMock 中的类。为了集成这样的自定义行为,PowerMock 注册了一个自定义MockMaker
,然后由 Mockito 使用。
In Mockito 2.0, the API for a custom MockMaker
had to be extended but PowerMock
does not yet adapt the API extensions. Therefore, this new method is not yet implemented by the PowerMock MockMaker
what 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. @Mock
remained 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 时,它对我有用。