0

I am trying to run a simple JUnit test

@RunWith(PowerMockRunner.class)
@PrepareForTest(DB2Connection.class)

    public class SomeClassTest {

    AnotherReqClass reqClassObject = null;
    private SomeClass dao;
    private DB2Connection connection = null;
    private Connection con = null;

    @BeforeClass
    public static void beforeClass(){

    //Getting some information from a settings XML file         
    }

    @Before
    public void setUp() throws Exception {

        //Mock the Connection class that contains the static method
        con = mock(Connection.class);

            //PowerMock the class that 
        PowerMockito.mockStatic(DB2Connection.class);
        when(DB2Connection.getDb2Connection()).thenReturn(con);

             //some Logic goes here
    }

    @Test
    public void testMethod(){

        String someString ="xyz";
        requiredClassObject = new AnotherRequiredClass(dao);
        try {           
                     //Some Logic
            assertEquals(//Something);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }    
}

Following is the stack trace:

org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
    at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:643)
    at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:308)
    at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validateTestMethods(PowerMockJUnit4MethodValidator.java:79)
    at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validateInstanceMethods(PowerMockJUnit4MethodValidator.java:49)
    at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:51)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:108)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:70)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl.<init>(PowerMockJUnit47RunnerDelegateImpl.java:42)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl.<init>(PowerMockJUnit49RunnerDelegateImpl.java:25)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:143)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39)
    at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
    at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:33)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
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.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
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)

When I try to run the test then I get error org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:643). Any suggestions will be appreciated. Thank You.

Stefan Birkner
  • 24,059
  • 12
  • 57
  • 72
user3044240
  • 621
  • 19
  • 33

2 Answers2

3

This is a bug that occurs when you use JUnit 4.12 and PowerMock < 1.6.1. The problem is solved in PowerMock 1.6.1. Please update your dependencies accordingly

testCompile 'junit:junit:4.12',
            'org.powermock:powermock-core:1.6.1',
            'org.powermock:powermock-module-junit4:1.6.1',
            'org.powermock:powermock-api-mockito:1.6.1'

If you cannot upgrade PowerMock then you can use JUnit 4.11.

testCompile 'junit:junit:4.11',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

Could you please add further lines of the stacktrace, which uncover more details about the problem.

Stefan Birkner
  • 24,059
  • 12
  • 57
  • 72
  • I added 1.6.1 for 4.12 but still the same error. I posted the whole stack trace above. – user3044240 Sep 16 '15 at 08:11
  • The stacktrace does no look like you're using 1.6.1. Line 79 of `PowerMockJUnit4MethodValidator` is an empty line in 1.6.1: https://github.com/jayway/powermock/blob/a1d86e75a40e741b48c6ed9d4093d7b2ff4c6805/modules/module-impl/junit4/src/main/java/org/powermock/modules/junit4/internal/impl/testcaseworkaround/PowerMockJUnit4MethodValidator.java – Stefan Birkner Sep 16 '15 at 11:11
  • Hello @Stefan Birkner.. I have added the three jars for junit 4.12 on my build path and I am still getting the same stack trace. Also, I dont understand what you mean by that line 79 is an empty line? Please help. JUnit test fails saying initializationError for the test class. – user3044240 Sep 16 '15 at 13:16
  • 1
    It worked! Error is gone. There was a different reference library which needed to have required 1.6.1 jars. After doing that it works. Thanks for your help. – user3044240 Sep 16 '15 at 13:48
1

It can happen according to your versions of PowerMockito and JUnit.

Try with these dependencies:

  • junit: 4.11
  • powermock-api-mockito: 1.5.6
  • powermock-module-junit4: 1.5.6
André Blaszczyk
  • 750
  • 4
  • 17