powermock: powermock causes Mockito's initMocks to fail when using @Mock

From jon.cho…@actifio.com on December 04, 2012 20:16:54

Here is my class under test:

public class MockMe {

private static final MockMe ME = new MockMe();

public static MockMe getInstance() {
        return ME;
}

}

And here is my test:

import static org.mockito.MockitoAnnotations.initMocks; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; import static org.testng.Assert.assertEquals;

import org.powermock.core.classloader.annotations.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockObjectFactory; import org.testng.IObjectFactory; import org.testng.annotations.BeforeTest; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test;

@PrepareForTest({MockMe.class}) public class TestTest {

@ObjectFactory
public IObjectFactory getObjectFactory() {
    return new PowerMockObjectFactory();
}

@Mock
public MockMe mockMe;

@BeforeTest
public void init() {
    initMocks(this);
    mockStatic(MockMe.class);
    when(MockMe.getInstance()).thenReturn(mockMe);
}

@Test
public void sampleTest() {
    MockMe mockMe1 = MockMe.getInstance();
    assertEquals(mockMe1, mockMe);
}

}

When I run this test it succeeds but If I replace the deprecated

org.powermock.core.classloader.annotations.Mock

with the appropriate

org.mockito.Mock

The test fails with the following stack trace:

FAILED CONFIGURATION: @BeforeTest init java.lang.ExceptionInInitializerError at org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter.<init>(ConditionalStackTraceFilter.java:17) at org.mockito.exceptions.base.MockitoException.filterStackTrace(MockitoException.java:30) at org.mockito.exceptions.base.MockitoException.<init>(MockitoException.java:19) at org.mockito.exceptions.misusing.MockitoConfigurationException.<init>(MockitoConfigurationException.java:18) at org.mockito.internal.configuration.ClassPathLoader.loadImplementations(ClassPathLoader.java:145) at org.mockito.internal.configuration.ClassPathLoader.findPluginImplementation(ClassPathLoader.java:110) at org.mockito.internal.configuration.ClassPathLoader.findPlatformMockMaker(ClassPathLoader.java:106) at org.mockito.internal.configuration.ClassPathLoader.<clinit>(ClassPathLoader.java:59) at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:21) at org.mockito.internal.MockitoCore.<init>(MockitoCore.java:40) at org.mockito.internal.stubbing.defaultanswers.ReturnsMocks.<init>(ReturnsMocks.java:18) at org.mockito.Answers.<clinit>(Answers.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.lang.Class.getEnumConstantsShared(Class.java:2942) at java.lang.Class.enumConstantDirectory(Class.java:2963) at java.lang.Enum.valueOf(Enum.java:191) at sun.reflect.annotation.AnnotationParser.parseEnumValue(AnnotationParser.java:413) at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:278) at java.lang.reflect.Method.getDefaultValue(Method.java:720) at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:99) at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:66) at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:202) at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69) at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52) at java.lang.reflect.Field.declaredAnnotations(Field.java:1014) at java.lang.reflect.Field.getAnnotation(Field.java:1000) at java.lang.reflect.AccessibleObject.isAnnotationPresent(AccessibleObject.java:168) at org.powermock.reflect.internal.matcherstrategies.FieldAnnotationMatcherStrategy.matches(FieldAnnotationMatcherStrategy.java:37) at org.powermock.reflect.internal.WhiteboxImpl.findAllFieldsUsingStrategy(WhiteboxImpl.java:535) at org.powermock.reflect.internal.WhiteboxImpl.getFieldsAnnotatedWith(WhiteboxImpl.java:2343) at org.powermock.reflect.Whitebox.getFieldsAnnotatedWith(Whitebox.java:585) at org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:70) at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:2014) at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:744) at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:415) at org.powermock.modules.testng.internal.PowerMockTestNGMethodHandler.injectMocksUsingAnnotationEnabler(PowerMockTestNGMethodHandler.java:72) at org.powermock.modules.testng.internal.PowerMockTestNGMethodHandler.invoke(PowerMockTestNGMethodHandler.java:47) at com.actifio.psrv.util.analysis.TestTest_$$javassist_0.init(TestTest$$_javassist_0.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138) at org.testng.TestRunner.beforeRun(TestRunner.java:641) at org.testng.TestRunner.run(TestRunner.java:609) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198) at org.testng.TestNG.runSuitesLocally(TestNG.java:1123) at org.testng.TestNG.run(TestNG.java:1031) at org.testng.TestNG.privateMain(TestNG.java:1338) at org.testng.TestNG.main(TestNG.java:1307) Caused by: java.lang.NullPointerException at org.mockito.internal.exceptions.stacktrace.S…

_Original issue: http://code.google.com/p/powermock/issues/detail?id=414_

About this issue

Most upvoted comments

The simplest example I think:

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockObjectFactory;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;

class DoesntMatter {}

@PrepareForTest(DoesntMatter.class)
public class UnitTest1 {

    //Object mock = PowerMockito.mock(Object.class); // uncommenting this fixes issue

    @ObjectFactory
    public PowerMockObjectFactory getObjectFactory() {
        return new PowerMockObjectFactory();
    }

    @Test
    public void test() throws Exception {
        // do job
    }
}

Extending PowerMockTestCase fixes it. Hope that helps.